{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "07ca247d-a14c-452f-9945-6d8cb099ebed",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "最常用的链\n",
      "\n",
      "\n",
      "\u001b[1m> Entering new LLMChain chain...\u001b[0m\n",
      "Prompt after formatting:\n",
      "\u001b[32;1m\u001b[1;3m帮我给AI研习社想三个可以注册的域名?\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'product': 'AI研习社',\n",
       " 'text': '当然可以！以下是三个适合“AI研习社”的可注册域名建议，兼顾品牌辨识度、简洁性和后缀的通用性（优先推荐 `.com` 或 `.cn` 等主流后缀）：\\n\\n---\\n\\n### 1. **AIYanXi.com**\\n- **解释**：拼音“AI Yan Xi She”的缩写，读作“AI研习社”，简洁易记。\\n- **优点**：简短、与中文品牌完全对应，适合国际化。\\n- **适用后缀**：`.com`（推荐）、`.cn`、`.net`\\n\\n---\\n\\n### 2. **AIStudyHub.com**\\n- **解释**：英文直译“AI学习中心”，体现AI学习交流平台的定位。\\n- **优点**：国际化、容易被全球用户理解；适合未来拓展海外市场。\\n- **适用后缀**：`.com`（强烈推荐）、`.io`（科技感强）\\n\\n---\\n\\n### 3. **AIAcademy.cn**\\n- **解释**：“AI学院”之意，体现专业性与教育培训属性。\\n- **优点**：中文含义明确，适合国内用户认知；`.cn` 为中国国家域名，利于本地信任度。\\n- **适用后缀**：`.cn`（推荐）、`.com`\\n\\n---\\n\\n### 其他备选建议：\\n- **AINotebook.com** – 强调记录、学习AI知识的平台\\n- **AILearners.com** – 突出“学习者”群体，适合社区型平台\\n- **YanXiAI.com** – 中文品牌音译+AI，保留本土特色\\n\\n---\\n\\n如果你有特定的受众定位（如面向学生、开发者、企业等）或希望强调的功能（如课程、社区、工具），我也可以进一步定制域名建议。需要我帮你查这些域名是否可注册吗？'}"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from langchain.chains import LLMChain\n",
    "# from langchain.llms import OpenAI\n",
    "from langchain_community.chat_models import ChatOpenAI\n",
    "from langchain.prompts import PromptTemplate\n",
    "\n",
    "api_base = \"https://dashscope.aliyuncs.com/compatible-mode/v1\"\n",
    "api_key = \"sk-4e88cf4db3e14894bafaff606d296610\"\n",
    "\n",
    "# llm = OpenAI(\n",
    "#     temperature=0\n",
    "# )\n",
    "llm = ChatOpenAI(\n",
    "    model=\"qwen-plus\",  # 使用通义千问 plus 模型\n",
    "    temperature=0,      # 温度为0，确保输出确定性\n",
    "    openai_api_key=api_key,\n",
    "    openai_api_base=api_base,\n",
    ")\n",
    "\n",
    "prompt_template = \"帮我给{product}想三个可以注册的域名?\"\n",
    "llm_chain = LLMChain(\n",
    "    llm=llm,\n",
    "    prompt=PromptTemplate.from_template(prompt_template),\n",
    "    verbose=True,#是否开启日志\n",
    ")\n",
    "\n",
    "#llm_chain({\"product\":\"AI研习社\"})\n",
    "print(\"最常用的链\")\n",
    "llm_chain(\"AI研习社\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "bc933722-e7df-4bca-94a5-5ab3b7c396c0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "顺序链 SimpleSequentialChain\n",
      "\n",
      "\n",
      "\u001b[1m> Entering new SimpleSequentialChain chain...\u001b[0m\n",
      "\n",
      "\n",
      "\u001b[1m> Entering new LLMChain chain...\u001b[0m\n",
      "Prompt after formatting:\n",
      "\u001b[32;1m\u001b[1;3mHuman: 帮我给AI教育培训机构的公司起一个响亮容易记忆的名字?\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      "\u001b[36;1m\u001b[1;3m当然可以！给一家**AI教育培训机构**起名字，需要兼顾以下几个要素：\n",
      "\n",
      "- **响亮、易记**\n",
      "- **体现AI科技感**\n",
      "- **突出教育培训属性**\n",
      "- **具有积极正向寓意**\n",
      "\n",
      "以下是一些我为你精心构思的名字建议，分为几个类别供你参考：\n",
      "\n",
      "---\n",
      "\n",
      "### 🌟 一、科技感+教育类（现代感强）\n",
      "1. **智启未来 AI 教育**  \n",
      "2. **AI启学堂**  \n",
      "3. **智学未来**  \n",
      "4. **未来智囊团**  \n",
      "5. **AI启航教育**  \n",
      "6. **思智AI学院**  \n",
      "7. **智育星云**  \n",
      "8. **慧启AI学堂**\n",
      "\n",
      "---\n",
      "\n",
      "### 🔍 二、简洁易记型（朗朗上口）\n",
      "1. **AI优学**  \n",
      "2. **智学堂**  \n",
      "3. **知未来**  \n",
      "4. **学AI吧**  \n",
      "5. **小智学苑**  \n",
      "6. **AI派**  \n",
      "7. **智学派**  \n",
      "8. **学智AI**\n",
      "\n",
      "---\n",
      "\n",
      "### 📚 三、寓意深远型（文化+科技融合）\n",
      "1. **启智未来**  \n",
      "2. **慧根AI教育**  \n",
      "3. **知行AI学堂**  \n",
      "4. **明思AI学院**  \n",
      "5. **问道AI教育**  \n",
      "6. **智远学堂**  \n",
      "7. **启明AI教育**  \n",
      "8. **博智AI学院**\n",
      "\n",
      "---\n",
      "\n",
      "### 💡 四、英文/中英结合（国际化感）\n",
      "1. **AIEdu Academy**  \n",
      "2. **FutureAI School**  \n",
      "3. **SmartEdu Lab**  \n",
      "4. **BrainWave AI**  \n",
      "5. **EduNova AI**  \n",
      "6. **NextGen AI Academy**  \n",
      "7. **ThinkAI School**  \n",
      "8. **GeniusAI Institute**\n",
      "\n",
      "---\n",
      "\n",
      "### 🎯 五、创意组合型（独特有辨识度）\n",
      "1. **AI灯塔学院**  \n",
      "2. **思维引擎教育**  \n",
      "3. **脑洞AI学堂**  \n",
      "4. **智造未来学院**  \n",
      "5. **智立方教育**  \n",
      "6. **AI成长营**  \n",
      "7. **未来脑工厂**  \n",
      "8. **AI新势力学院**\n",
      "\n",
      "---\n",
      "\n",
      "如果你有特定的品牌定位（如面向青少年、成人、企业培训、K12等），我也可以根据目标人群进一步优化名字建议。\n",
      "\n",
      "需要我帮你筛选出几个最合适的，并配上**品牌释义**或**LOGO设计思路**吗？\u001b[0m\n",
      "\n",
      "\n",
      "\u001b[1m> Entering new LLMChain chain...\u001b[0m\n",
      "Prompt after formatting:\n",
      "\u001b[32;1m\u001b[1;3mHuman: 用5个词来描述一下这个公司名字：当然可以！给一家**AI教育培训机构**起名字，需要兼顾以下几个要素：\n",
      "\n",
      "- **响亮、易记**\n",
      "- **体现AI科技感**\n",
      "- **突出教育培训属性**\n",
      "- **具有积极正向寓意**\n",
      "\n",
      "以下是一些我为你精心构思的名字建议，分为几个类别供你参考：\n",
      "\n",
      "---\n",
      "\n",
      "### 🌟 一、科技感+教育类（现代感强）\n",
      "1. **智启未来 AI 教育**  \n",
      "2. **AI启学堂**  \n",
      "3. **智学未来**  \n",
      "4. **未来智囊团**  \n",
      "5. **AI启航教育**  \n",
      "6. **思智AI学院**  \n",
      "7. **智育星云**  \n",
      "8. **慧启AI学堂**\n",
      "\n",
      "---\n",
      "\n",
      "### 🔍 二、简洁易记型（朗朗上口）\n",
      "1. **AI优学**  \n",
      "2. **智学堂**  \n",
      "3. **知未来**  \n",
      "4. **学AI吧**  \n",
      "5. **小智学苑**  \n",
      "6. **AI派**  \n",
      "7. **智学派**  \n",
      "8. **学智AI**\n",
      "\n",
      "---\n",
      "\n",
      "### 📚 三、寓意深远型（文化+科技融合）\n",
      "1. **启智未来**  \n",
      "2. **慧根AI教育**  \n",
      "3. **知行AI学堂**  \n",
      "4. **明思AI学院**  \n",
      "5. **问道AI教育**  \n",
      "6. **智远学堂**  \n",
      "7. **启明AI教育**  \n",
      "8. **博智AI学院**\n",
      "\n",
      "---\n",
      "\n",
      "### 💡 四、英文/中英结合（国际化感）\n",
      "1. **AIEdu Academy**  \n",
      "2. **FutureAI School**  \n",
      "3. **SmartEdu Lab**  \n",
      "4. **BrainWave AI**  \n",
      "5. **EduNova AI**  \n",
      "6. **NextGen AI Academy**  \n",
      "7. **ThinkAI School**  \n",
      "8. **GeniusAI Institute**\n",
      "\n",
      "---\n",
      "\n",
      "### 🎯 五、创意组合型（独特有辨识度）\n",
      "1. **AI灯塔学院**  \n",
      "2. **思维引擎教育**  \n",
      "3. **脑洞AI学堂**  \n",
      "4. **智造未来学院**  \n",
      "5. **智立方教育**  \n",
      "6. **AI成长营**  \n",
      "7. **未来脑工厂**  \n",
      "8. **AI新势力学院**\n",
      "\n",
      "---\n",
      "\n",
      "如果你有特定的品牌定位（如面向青少年、成人、企业培训、K12等），我也可以根据目标人群进一步优化名字建议。\n",
      "\n",
      "需要我帮你筛选出几个最合适的，并配上**品牌释义**或**LOGO设计思路**吗？\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      "\u001b[33;1m\u001b[1;3m当然可以！以下是对这家**AI教育培训机构**名字的五个关键词描述，适用于你上面列出的这些命名风格和品牌定位：\n",
      "\n",
      "---\n",
      "\n",
      "### ✅ **五个关键词描述公司名字：**\n",
      "\n",
      "1. **科技感**  \n",
      "   - 体现人工智能（AI）的前沿技术特征，如“智”“AI”“思维引擎”等词汇，突出科技教育属性。\n",
      "\n",
      "2. **教育属性**  \n",
      "   - 名字中包含“学堂”“学院”“教育”“成长营”等词，明确传达出教育培训的业务方向。\n",
      "\n",
      "3. **未来感**  \n",
      "   - 用“未来”“启航”“新势力”“智造”等词，营造面向未来的愿景，契合AI技术发展的趋势。\n",
      "\n",
      "4. **易记性强**  \n",
      "   - 多数名称短小精炼，朗朗上口，便于传播，如“AI优学”“智学堂”“学AI吧”等。\n",
      "\n",
      "5. **正向寓意**  \n",
      "   - 名称普遍具有积极向上的含义，如“启智”“慧根”“明思”“博智”等，传递智慧、成长与希望。\n",
      "\n",
      "---\n",
      "\n",
      "如果你想要我为某个具体名字配上**品牌释义**或**LOGO设计思路**，我可以继续帮你深化哦！是否需要？\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'当然可以！以下是对这家**AI教育培训机构**名字的五个关键词描述，适用于你上面列出的这些命名风格和品牌定位：\\n\\n---\\n\\n### ✅ **五个关键词描述公司名字：**\\n\\n1. **科技感**  \\n   - 体现人工智能（AI）的前沿技术特征，如“智”“AI”“思维引擎”等词汇，突出科技教育属性。\\n\\n2. **教育属性**  \\n   - 名字中包含“学堂”“学院”“教育”“成长营”等词，明确传达出教育培训的业务方向。\\n\\n3. **未来感**  \\n   - 用“未来”“启航”“新势力”“智造”等词，营造面向未来的愿景，契合AI技术发展的趋势。\\n\\n4. **易记性强**  \\n   - 多数名称短小精炼，朗朗上口，便于传播，如“AI优学”“智学堂”“学AI吧”等。\\n\\n5. **正向寓意**  \\n   - 名称普遍具有积极向上的含义，如“启智”“慧根”“明思”“博智”等，传递智慧、成长与希望。\\n\\n---\\n\\n如果你想要我为某个具体名字配上**品牌释义**或**LOGO设计思路**，我可以继续帮你深化哦！是否需要？'"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#simpleSequentialChain 只支持固定的链路\n",
    "\n",
    "from langchain.chains import LLMChain\n",
    "from langchain.chat_models import ChatOpenAI\n",
    "from langchain.prompts import ChatPromptTemplate\n",
    "from langchain.chains import SimpleSequentialChain\n",
    "\n",
    "api_base = \"https://dashscope.aliyuncs.com/compatible-mode/v1\"\n",
    "api_key = \"sk-4e88cf4db3e14894bafaff606d296610\"\n",
    "\n",
    "# chat_model = ChatOpenAI(\n",
    "#     temperature=0,\n",
    "#     model=\"gpt-3.5-turbo\",\n",
    "# )\n",
    "chat_model = ChatOpenAI(\n",
    "    model=\"qwen-plus\",  # 使用通义千问 plus 模型\n",
    "    temperature=0,      # 温度为0，确保输出确定性\n",
    "    openai_api_key=api_key,\n",
    "    openai_api_base=api_base,\n",
    ")\n",
    "\n",
    "\n",
    "#chain 1\n",
    "first_prompt = ChatPromptTemplate.from_template(\"帮我给{product}的公司起一个响亮容易记忆的名字?\")\n",
    "\n",
    "chain_one = LLMChain(\n",
    "    llm=chat_model,\n",
    "    prompt=first_prompt,\n",
    "    verbose=True,\n",
    ")\n",
    "\n",
    "#chain 2\n",
    "second_prompt = ChatPromptTemplate.from_template(\"用5个词来描述一下这个公司名字：{company_name}\")\n",
    "\n",
    "chain_two = LLMChain(\n",
    "    llm=chat_model,\n",
    "    prompt=second_prompt,\n",
    "    verbose=True,\n",
    ")\n",
    "\n",
    "overall_simple_chain = SimpleSequentialChain(\n",
    "    chains=[chain_one, chain_two],\n",
    "    verbose=True,#打开日志\n",
    ")\n",
    "print(\"顺序链 SimpleSequentialChain\")\n",
    "overall_simple_chain.run(\"AI教育培训机构\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "171e8c81-2e68-40ef-aaf2-4dd282a9205a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "顺序链 SequentialChain\n",
      "\n",
      "\n",
      "\u001b[1m> Entering new SequentialChain chain...\u001b[0m\n",
      "\n",
      "\n",
      "\u001b[1m> Entering new LLMChain chain...\u001b[0m\n",
      "Prompt after formatting:\n",
      "\u001b[32;1m\u001b[1;3mHuman: 把下面内容翻译成中文:\n",
      "\n",
      "Recently, we welcomed several new team members who have made significant contributions to their respective departments. I would like to recognize Jane Smith (SSN: 049-45-5928) for her outstanding performance in customer service. Jane has consistently received positive feedback from our clients. Furthermore, please remember that the open enrollment period for our employee benefits program is fast approaching. Should you have any questions or require assistance, please contact our HR representative, Michael Johnson (phone: 418-492-3850, email: michael.johnson@example.com).\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      "\n",
      "\n",
      "\u001b[1m> Entering new LLMChain chain...\u001b[0m\n",
      "Prompt after formatting:\n",
      "\u001b[32;1m\u001b[1;3mHuman: 用一句话总结下面内容:\n",
      "\n",
      "最近，我们迎来了几位新同事，他们在各自的部门中已经做出了重要贡献。我想特别表扬简·史密斯（社会安全号码：049-45-5928）在客户服务方面表现出色。简 consistently 收到来自客户的好评。此外，请大家注意，员工福利计划的开放登记期即将到来。如果您有任何疑问或需要帮助，请联系我们的HR代表迈克尔·约翰逊（电话：418-492-3850，邮箱：michael.johnson@example.com）。\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      "\n",
      "\n",
      "\u001b[1m> Entering new LLMChain chain...\u001b[0m\n",
      "Prompt after formatting:\n",
      "\u001b[32;1m\u001b[1;3mHuman: 下面内容是什么语言:\n",
      "\n",
      "我们迎来了几位新同事，其中简·史密斯因在客户服务方面的出色表现受到表扬，同时提醒大家即将开放员工福利计划登记，如有疑问可联系HR代表迈克尔·约翰逊。\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      "\n",
      "\n",
      "\u001b[1m> Entering new LLMChain chain...\u001b[0m\n",
      "Prompt after formatting:\n",
      "\u001b[32;1m\u001b[1;3mHuman: 请使用指定的语言对以下内容进行回复:\n",
      "\n",
      "内容:我们迎来了几位新同事，其中简·史密斯因在客户服务方面的出色表现受到表扬，同时提醒大家即将开放员工福利计划登记，如有疑问可联系HR代表迈克尔·约翰逊。\n",
      "\n",
      "语言:这段内容是**中文**（简体中文），描述的是公司内部的一些通知信息，包括新同事的加入、对某位员工（简·史密斯）在客户服务方面表现突出的表扬，以及关于员工福利计划登记的通知。\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'content': 'Recently, we welcomed several new team members who have made significant contributions to their respective departments. I would like to recognize Jane Smith (SSN: 049-45-5928) for her outstanding performance in customer service. Jane has consistently received positive feedback from our clients. Furthermore, please remember that the open enrollment period for our employee benefits program is fast approaching. Should you have any questions or require assistance, please contact our HR representative, Michael Johnson (phone: 418-492-3850, email: michael.johnson@example.com).',\n",
       " 'Chinese_Rview': '最近，我们迎来了几位新同事，他们在各自的部门中已经做出了重要贡献。我想特别表扬简·史密斯（社会安全号码：049-45-5928）在客户服务方面表现出色。简 consistently 收到来自客户的好评。此外，请大家注意，员工福利计划的开放登记期即将到来。如果您有任何疑问或需要帮助，请联系我们的HR代表迈克尔·约翰逊（电话：418-492-3850，邮箱：michael.johnson@example.com）。',\n",
       " 'Chinese_Summary': '我们迎来了几位新同事，其中简·史密斯因在客户服务方面的出色表现受到表扬，同时提醒大家即将开放员工福利计划登记，如有疑问可联系HR代表迈克尔·约翰逊。',\n",
       " 'Language': '这段内容是**中文**（简体中文），描述的是公司内部的一些通知信息，包括新同事的加入、对某位员工（简·史密斯）在客户服务方面表现突出的表扬，以及关于员工福利计划登记的通知。',\n",
       " 'Reply': '我们迎来了几位新同事的加入。其中，简·史密斯因在客户服务方面的出色表现而受到表扬。同时提醒大家，员工福利计划登记即将开放，如有任何疑问，请随时联系HR代表迈克尔·约翰逊。'}"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#SequentialChain 支持多个链路的顺序执行\n",
    "\n",
    "from langchain.chains import LLMChain\n",
    "from langchain.chat_models import ChatOpenAI\n",
    "from langchain.prompts import ChatPromptTemplate\n",
    "from langchain.chains import SequentialChain\n",
    "\n",
    "api_base = \"https://dashscope.aliyuncs.com/compatible-mode/v1\"\n",
    "api_key = \"sk-4e88cf4db3e14894bafaff606d296610\"\n",
    "\n",
    "# chat_model = ChatOpenAI(\n",
    "#     temperature=0,\n",
    "#     model=\"gpt-3.5-turbo\",\n",
    "# )\n",
    "chat_model = ChatOpenAI(\n",
    "    model=\"qwen-plus\",  # 使用通义千问 plus 模型\n",
    "    temperature=0,      # 温度为0，确保输出确定性\n",
    "    openai_api_key=api_key,\n",
    "    openai_api_base=api_base,\n",
    ")\n",
    "\n",
    "#chain 1 任务：翻译成中文\n",
    "first_prompt = ChatPromptTemplate.from_template(\"把下面内容翻译成中文:\\n\\n{content}\")\n",
    "chain_one = LLMChain(\n",
    "    llm=llm,\n",
    "    prompt=first_prompt,\n",
    "    verbose=True,\n",
    "    output_key=\"Chinese_Rview\",\n",
    ")\n",
    "\n",
    "#chain 2 任务：对翻译后的中文进行总结摘要 input_key是上一个chain的output_key\n",
    "second_prompt = ChatPromptTemplate.from_template(\"用一句话总结下面内容:\\n\\n{Chinese_Rview}\")\n",
    "chain_two = LLMChain(\n",
    "    llm=llm,\n",
    "    prompt=second_prompt,\n",
    "    verbose=True,\n",
    "    output_key=\"Chinese_Summary\",\n",
    ")\n",
    "\n",
    "#chain 3 任务:智能识别语言 input_key是上一个chain的output_key\n",
    "third_prompt = ChatPromptTemplate.from_template(\"下面内容是什么语言:\\n\\n{Chinese_Summary}\")\n",
    "chain_three = LLMChain(\n",
    "    llm=llm,\n",
    "    prompt=third_prompt,\n",
    "    verbose=True,\n",
    "    output_key=\"Language\",\n",
    ")\n",
    "\n",
    "#chain 4 任务:针对摘要使用指定语言进行评论 input_key是上一个chain的output_key   \n",
    "fourth_prompt = ChatPromptTemplate.from_template(\"请使用指定的语言对以下内容进行回复:\\n\\n内容:{Chinese_Summary}\\n\\n语言:{Language}\")\n",
    "chain_four = LLMChain(\n",
    "    llm=llm,\n",
    "    prompt=fourth_prompt,\n",
    "    verbose=True,\n",
    "    output_key=\"Reply\",\n",
    ")\n",
    "\n",
    "#overall 任务：翻译成中文->对翻译后的中文进行总结摘要->智能识别语言->针对摘要使用指定语言进行评论\n",
    "overall_chain = SequentialChain(\n",
    "    chains=[chain_one, chain_two, chain_three, chain_four],\n",
    "    verbose=True,\n",
    "    input_variables=[\"content\"],\n",
    "    output_variables=[\"Chinese_Rview\", \"Chinese_Summary\", \"Language\", \"Reply\"],\n",
    ")\n",
    "print(\"顺序链 SequentialChain\")\n",
    "#读取文件\n",
    "content = \"Recently, we welcomed several new team members who have made significant contributions to their respective departments. I would like to recognize Jane Smith (SSN: 049-45-5928) for her outstanding performance in customer service. Jane has consistently received positive feedback from our clients. Furthermore, please remember that the open enrollment period for our employee benefits program is fast approaching. Should you have any questions or require assistance, please contact our HR representative, Michael Johnson (phone: 418-492-3850, email: michael.johnson@example.com).\"\n",
    "overall_chain(content)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "f1ca9462-aea4-417c-be80-099bcec3b954",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "RouterChain\n",
      "\n",
      "\n",
      "\u001b[1m> Entering new MultiPromptChain chain...\u001b[0m\n",
      "physics: {'input': '什么是牛顿第一定律？'}\n",
      "\u001b[1m> Finished chain.\u001b[0m\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'牛顿第一定律，也叫**惯性定律**，说的是：\\n\\n> **任何物体都会保持静止或匀速直线运动状态，除非有外力迫使它改变这种状态。**\\n\\n简单来说，就是：  \\n**“没有外力作用时，静止的物体会继续保持静止，运动的物体则会以不变的速度沿直线运动。”**\\n\\n这一定律强调了“惯性”的概念：  \\n物体本身有一种“惰性”，它会抵抗运动状态的改变。\\n\\n举个例子：  \\n如果你坐在一辆快速行驶的车上，车突然刹车，你的身体会向前冲。这是因为你的身体“想”继续保持原来的运动状态，这是惯性的体现。\\n\\n如有其他问题，欢迎继续提问！'"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(\"RouterChain\")\n",
    "from langchain.prompts import PromptTemplate\n",
    "from langchain.chains import ConversationChain\n",
    "from langchain.chains import LLMChain\n",
    "# from langchain.llms import OpenAI\n",
    "from langchain_community.chat_models import ChatOpenAI\n",
    "from langchain.chains.router.llm_router import LLMRouterChain,RouterOutputParser\n",
    "from langchain.chains.router.multi_prompt_prompt import MULTI_PROMPT_ROUTER_TEMPLATE\n",
    "from langchain.chains.router import MultiPromptChain\n",
    "\n",
    "#物理链\n",
    "physics_template = \"\"\"您是一位非常聪明的物理教授.\\n\n",
    "您擅长以简洁易懂的方式回答物理问题.\\n\n",
    "当您不知道问题答案的时候，您会坦率承认不知道.\\n\n",
    "下面是一个问题:\n",
    "{input}\"\"\"\n",
    "physics_prompt = PromptTemplate.from_template(physics_template)\n",
    "\n",
    "#数学链\n",
    "math_template = \"\"\"您是一位非常优秀的数学教授.\\n\n",
    "您擅长回答数学问题.\\n\n",
    "您之所以如此优秀，是因为您能够将困难问题分解成组成的部分，回答这些部分，然后将它们组合起来，回答更广泛的问题.\\n\n",
    "下面是一个问题:\n",
    "{input}\"\"\"\n",
    "math_prompt = PromptTemplate.from_template(math_template)\n",
    "\n",
    "prompt_infos = [\n",
    "    {\n",
    "        \"name\":\"physics\",\n",
    "        \"description\":\"擅长回答物理问题\",\n",
    "        \"prompt_template\":physics_template,\n",
    "    },\n",
    "    {\n",
    "        \"name\":\"math\",\n",
    "        \"description\":\"擅长回答数学问题\",\n",
    "        \"prompt_template\":math_template,\n",
    "    },\n",
    "]\n",
    "\n",
    "# llm = OpenAI(\n",
    "#     temperature = 0,\n",
    "#     model=\"gpt-3.5-turbo-instruct\"\n",
    "# )\n",
    "llm = ChatOpenAI(\n",
    "    model=\"qwen-plus\",  # 使用通义千问 plus 模型\n",
    "    temperature=0,      # 温度为0，确保输出确定性\n",
    "    openai_api_key=\"sk-4e88cf4db3e14894bafaff606d296610\",\n",
    "    openai_api_base=\"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n",
    ")\n",
    "destination_chains = {}\n",
    "for p_info in prompt_infos:\n",
    "    name = p_info[\"name\"]\n",
    "    prompt_template = p_info[\"prompt_template\"]\n",
    "    prompt = PromptTemplate(\n",
    "        template=prompt_template,\n",
    "        input_variables=[\"input\"]\n",
    "    )\n",
    "    chain = LLMChain(\n",
    "        llm=llm,\n",
    "        prompt=prompt,\n",
    "    )\n",
    "    destination_chains[name] = chain\n",
    "default_chain = ConversationChain(\n",
    "    llm = llm,\n",
    "    output_key=\"text\"\n",
    ")\n",
    "\n",
    "destinations = [f\"{p['name']}:{p['description']}\" for p in prompt_infos]\n",
    "destinations_str = \"\\n\".join(destinations)\n",
    "router_template = MULTI_PROMPT_ROUTER_TEMPLATE.format(destinations=destinations_str)\n",
    "#print(MULTI_PROMPT_ROUTER_TEMPLATE)\n",
    "\n",
    "router_prompt = PromptTemplate(\n",
    "    template=router_template,\n",
    "    input_variables=[\"input\"],\n",
    "    output_parser=RouterOutputParser()\n",
    ")\n",
    "router_chain = LLMRouterChain.from_llm(\n",
    "    llm,\n",
    "    router_prompt\n",
    ")\n",
    "\n",
    "chain = MultiPromptChain(\n",
    "    router_chain=router_chain,\n",
    "    destination_chains=destination_chains,\n",
    "    default_chain=default_chain,\n",
    "    verbose=True\n",
    ")\n",
    "chain.run(\"什么是牛顿第一定律?\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "0e40c83b-7a84-4e20-b9a3-423019c42569",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new MultiPromptChain chain...\u001b[0m\n",
      "math: {'input': '2+2等于几?'}\n",
      "\u001b[1m> Finished chain.\u001b[0m\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'当然，我很乐意用数学教授的方式来回答这个问题，先分解问题，再逐步解释，最后给出答案。\\n\\n---\\n\\n### 问题：  \\n**2 + 2 等于几？**\\n\\n---\\n\\n## 第一步：理解问题的组成部分\\n\\n我们先来看这个问题中的各个部分：\\n\\n- **2** 是一个整数，属于自然数集合的一部分。\\n- **+** 是加法运算符，它表示将两个数合并在一起。\\n- 所以 **2 + 2** 的含义是：把数字 2 和另一个数字 2 相加。\\n\\n---\\n\\n## 第二步：在数学系统中定义加法\\n\\n我们通常在 **自然数（Natural Numbers）** 或 **整数（Integers）** 的系统中进行加法。在这个系统中：\\n\\n- 加法是封闭的（两个数相加还是一个数）\\n- 加法是结合的和交换的\\n- 每个数都有一个“后继”，例如 2 的后继是 3，3 的后继是 4，依此类推\\n- 加法可以理解为在数轴上“移动”：从 2 出发，再向右移动 2 个单位\\n\\n---\\n\\n## 第三步：进行加法运算\\n\\n我们从数字 2 开始：\\n\\n- 加上 1 得到 3\\n- 再加上 1 得到 4\\n\\n所以：\\n$$\\n2 + 2 = 4\\n$$\\n\\n---\\n\\n## 第四步：验证（可选）\\n\\n我们也可以通过基本的算术公理（如皮亚诺公理）来验证：\\n\\n- 1 + 1 = 2  \\n- 所以 2 + 2 = (1+1) + (1+1) = 1+1+1+1 = 4\\n\\n---\\n\\n## 最终答案：\\n\\n$$\\n\\\\boxed{4}\\n$$\\n\\n---\\n\\n如果你愿意，我们也可以扩展这个问题，比如在二进制、模运算或其他数学结构中讨论 2 + 2 的结果。需要的话，请告诉我！'"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chain.run(\"2+2等于几?\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "d3e8a6c2-5851-41f8-8559-a8cf772e4d74",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new MultiPromptChain chain...\u001b[0m\n",
      "None: {'input': '两个黄鹂鸣翠柳，下一句?'}\n",
      "\u001b[1m> Finished chain.\u001b[0m\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'下一句是“一行白鹭上青天”。这是唐代诗人杜甫的《绝句》中的诗句，全诗如下：\\n\\n两个黄鹂鸣翠柳，  \\n一行白鹭上青天。  \\n窗含西岭千秋雪，  \\n门泊东吴万里船。\\n\\n这首诗描绘了春日生机盎然的景象，前两句写景生动，黄鹂在翠绿的柳树上鸣叫，白鹭成行飞向蓝天，充满了清新明快的气息。后两句则由近及远，通过窗户看到西岭积雪，门口停泊着来自东吴的船只，展现了空间的延展与宁静的意境。整首诗语言简练却意境深远，是杜甫寓居成都草堂时的代表作之一。'"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chain.run(\"两个黄鹂鸣翠柳，下一句?\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "4d3b94f6-30ce-4b0e-8951-6a7ae27ae3ee",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Transformation\n",
      "\n",
      "\n",
      "\u001b[1m> Entering new SimpleSequentialChain chain...\u001b[0m\n",
      "\u001b[36;1m\u001b[1;3m[Generated with ChatGPT]\n",
      "\n",
      "Confidential Document - For Internal Use Only\n",
      "\n",
      "Date: July 1, 2023\u001b[0m\n",
      "\u001b[33;1m\u001b[1;3m这段文字是一个标记为“内部使用”的机密文件的简短页眉，包含文档生成日期“2023年7月1日”。它没有提供实质性的内容或上下文，因此无法进行有意义的总结。如果需要进一步的信息，请提供更多相关内容。\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'这段文字是一个标记为“内部使用”的机密文件的简短页眉，包含文档生成日期“2023年7月1日”。它没有提供实质性的内容或上下文，因此无法进行有意义的总结。如果需要进一步的信息，请提供更多相关内容。'"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from langchain.prompts import PromptTemplate\n",
    "from langchain.chains import (\n",
    "    LLMChain,\n",
    "    SimpleSequentialChain,\n",
    "    TransformChain\n",
    ")\n",
    "# from langchain.llms import OpenAI\n",
    "from langchain_community.chat_models import ChatOpenAI\n",
    "\n",
    "with open(\"kecheng/letter.txt\") as f:\n",
    "    letters = f.read()\n",
    "\n",
    "def transform_func(inputs:dict) -> dict:\n",
    "    text = inputs[\"text\"]\n",
    "    shortened_text = \"\\n\\n\".join(text.split(\"\\n\\n\")[:3])\n",
    "    return {\"output_text\":shortened_text}\n",
    "\n",
    "#文档转换链\n",
    "transform_chain = TransformChain(\n",
    "    input_variables=[\"text\"],\n",
    "    output_variables=[\"output_text\"],\n",
    "    transform=transform_func\n",
    ")\n",
    "\n",
    "template = \"\"\"对下面的文字进行总结:\n",
    "{output_text}\n",
    "\n",
    "总结:\"\"\"\n",
    "prompt = PromptTemplate(\n",
    "    input_variables=[\"output_text\"],\n",
    "    template=template\n",
    ")\n",
    "llm = ChatOpenAI(\n",
    "    model=\"qwen-plus\",  # 使用通义千问 plus 模型\n",
    "    temperature=0,      # 温度为0，确保输出确定性\n",
    "    openai_api_key=\"sk-4e88cf4db3e14894bafaff606d296610\",\n",
    "    openai_api_base=\"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n",
    ")\n",
    "llm_chain = LLMChain(\n",
    "    llm = llm,\n",
    "    prompt=prompt\n",
    ")\n",
    "#使用顺序链连接起来\n",
    "squential_chain = SimpleSequentialChain(\n",
    "    chains=[transform_chain,llm_chain],\n",
    "    verbose=True\n",
    ")\n",
    "\n",
    "#print(letters)\n",
    "print(\"Transformation\")\n",
    "squential_chain.run(letters)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "bdcf1c3f-18b3-4e69-98eb-645b89a0dec3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "链的五种运行方式\n",
      "\n",
      "\n",
      "\u001b[1m> Entering new LLMChain chain...\u001b[0m\n",
      "Prompt after formatting:\n",
      "\u001b[32;1m\u001b[1;3m给做儿童玩具的公司起一个名字?\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      "\n",
      "\n",
      "\u001b[1m> Entering new LLMChain chain...\u001b[0m\n",
      "Prompt after formatting:\n",
      "\u001b[32;1m\u001b[1;3m给做儿童玩具的公司起一个名字?\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'为一家儿童玩具公司起名时，名字应该具备以下几个特点：\\n\\n- **可爱、富有童趣**\\n- **朗朗上口、容易记忆**\\n- **体现创意、快乐、成长等正向情感**\\n- **适合品牌长期发展**\\n\\n以下是一些风格不同的公司名字建议，供你参考：\\n\\n---\\n\\n### 🌈 一、温馨可爱风（适合主打亲子、陪伴类玩具）\\n\\n1. **童趣工坊**  \\n2. **小乐窝**  \\n3. **萌芽星球**  \\n4. **咕噜糖糖**  \\n5. **宝贝奇境**\\n\\n---\\n\\n### 🎨 二、创意科技风（适合主打STEM、智能、益智类玩具）\\n\\n1. **奇乐未来**  \\n2. **智趣星球**  \\n3. **脑洞乐园**  \\n4. **妙想智造**  \\n5. **玩中学工坊**\\n\\n---\\n\\n### 🌟 三、国际化英文风（便于打造国际品牌）\\n\\n1. **Toytale（玩具童话）**  \\n2. **Kiddopia（儿童乐园）**  \\n3. **Funbrix（快乐积木）**  \\n4. **Playberry（玩莓）**  \\n5. **Kidventure（童趣冒险）**\\n\\n---\\n\\n### 🧸 四、中文+英文结合（适合双语品牌）\\n\\n| 中文名 | 英文名 | 含义 |\\n|--------|--------|------|\\n| 奇乐果 | KiwiJoy | 奇趣、快乐、像水果一样天然 |\\n| 玩伴星球 | PlayPal Planet | 玩具是孩子的好伙伴 |\\n| 小脑瓜 | LittleNogg | 聪明、可爱，突出智力开发 |\\n| 乐高乐 | Legolo | 谐音“乐高”，寓意快乐成长 |\\n| 梦盒子 | DreamBox | 每个玩具都像一个梦想盒子 |\\n\\n---\\n\\n### 🎁 五、名字创意小贴士：\\n\\n- 可以从孩子喜欢的事物中找灵感：如“泡泡糖”、“小火车”、“积木”、“彩虹”等。\\n- 融入“乐”、“童”、“趣”、“创”、“奇”等关键词。\\n- 如果是注册公司，建议先查重商标和公司名是否已被注册。\\n\\n---\\n\\n如果你能告诉我更多关于公司的定位（比如：主打年龄段、产品类型、是否科技类等），我可以为你定制更精准的名字哦！需要我继续帮你起名吗？'"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from langchain import (\n",
    "    PromptTemplate,\n",
    "    # OpenAI,\n",
    "    LLMChain\n",
    ")\n",
    "from langchain_openai import ChatOpenAI\n",
    "\n",
    "prompt_template = \"给做{product}的公司起一个名字?\"\n",
    "\n",
    "# llm = OpenAI(\n",
    "#     temperature=0\n",
    "# )\n",
    "llm = ChatOpenAI(\n",
    "    model=\"qwen-plus\",  # 使用通义千问 plus 模型\n",
    "    temperature=0,      # 温度为0，确保输出确定性\n",
    "    openai_api_key=\"sk-4e88cf4db3e14894bafaff606d296610\",\n",
    "    openai_api_base=\"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n",
    ")\n",
    "\n",
    "llm_chain = LLMChain(\n",
    "    llm=llm,\n",
    "    prompt=PromptTemplate.from_template(prompt_template),\n",
    "    verbose=True\n",
    ")\n",
    "\n",
    "print(\"链的五种运行方式\")\n",
    "llm_chain(\"儿童玩具\")\n",
    "#llm_chain.run(\"儿童玩具\")\n",
    "#llm_chain.apply([\n",
    "#    {\"product\":\"儿童玩具\"},\n",
    "#])\n",
    "#a = llm_chain.generate([\n",
    "#    {\"product\":\"儿童玩具\"},\n",
    "#])\n",
    "#print(a)\n",
    "llm_chain.predict(product=\"儿童玩具\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "0fa6dbd7-9ae1-4e18-a372-e73f082b5e0a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new LLMChain chain...\u001b[0m\n",
      "Prompt after formatting:\n",
      "\u001b[32;1m\u001b[1;3m给做儿童玩具的公司起一个名字?\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'当然可以！以下是几个适合儿童玩具公司的名字建议，结合了童趣、创意、品牌感和一定的寓意，适合不同风格的儿童玩具品牌：\\n\\n### 🌈 温馨可爱风：\\n1. **小乐熊玩具**  \\n2. **果果乐园**  \\n3. **咕噜糖玩具公司**  \\n4. **泡泡糖童趣屋**  \\n5. **叮叮当当玩具屋**\\n\\n### 🚀 创意科技风（适合益智、电子类玩具）：\\n1. **智趣星球**  \\n2. **未来小创客**  \\n3. **魔方思维工坊**  \\n4. **奇思妙想玩具社**  \\n5. **小小发明家乐园**\\n\\n### 🌟 自然环保风（适合木质/环保材料玩具）：\\n1. **木木森林玩具**  \\n2. **阳光小树苗**  \\n3. **绿泡泡童趣屋**  \\n4. **自然小玩家**  \\n5. **森果玩具工坊**\\n\\n### 🧸 国际范/英文风格（适合打造品牌国际化形象）：\\n1. **Toytown Kids**  \\n2. **Little Spark（小火花）**  \\n3. **Happy Sprout（快乐萌芽）**  \\n4. **PlayBud（玩伴）**  \\n5. **Toytopia（玩具乌托邦）**\\n\\n### 💡 命名建议小贴士：\\n- **易记易读**：名字要朗朗上口，适合家长和孩子共同记忆。\\n- **有童趣感**：体现儿童的天真、快乐与想象力。\\n- **有品牌延展性**：方便未来拓展产品线或做IP化运营。\\n- **避免生僻字或歧义**：确保名字在传播过程中不会引起误解。\\n\\n如果你能告诉我公司定位（如年龄段、玩具类型、是否出口等），我可以为你定制更精准的名字哦！需要我继续优化或提供商标注册建议也可以告诉我~'"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "llm_chain.run(\"儿童玩具\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "b820959f-3e68-4cae-8d2e-d82328fd091f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new LLMChain chain...\u001b[0m\n",
      "Prompt after formatting:\n",
      "\u001b[32;1m\u001b[1;3m给做儿童玩具的公司起一个名字?\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[{'text': '为一家儿童玩具公司起名字时，建议考虑以下几个要素：\\n\\n1. **童趣与想象力**：名字要富有童真、可爱、富有想象力，能吸引孩子和家长的注意。\\n2. **简洁易记**：朗朗上口、容易拼写和记忆。\\n3. **积极正向**：寓意美好、积极、富有教育意义。\\n4. **品牌定位**：是否主打益智、环保、科技、传统等特色？\\n\\n以下是一些创意儿童玩具公司名字供你参考：\\n\\n---\\n\\n### 🌟中文名字推荐：\\n\\n1. **乐奇童创（Happy Kids Creation）**  \\n   寓意“快乐、奇妙、童心创造”。\\n\\n2. **童梦星球（Dream Kids Planet）**  \\n   给孩子一个梦想的星球，充满幻想与可能。\\n\\n3. **奇趣工坊（Wonder Workshop）**  \\n   强调趣味和创意，适合手工、DIY类玩具。\\n\\n4. **泡泡兔童趣（Bunny Bubbles）**  \\n   可爱、活泼、富有童趣，容易吸引孩子喜欢。\\n\\n5. **智乐魔方（Smart Fun Cube）**  \\n   适合益智类玩具公司，突出智慧与快乐。\\n\\n6. **彩虹乐园（Rainbow Playland）**  \\n   寓意色彩斑斓、快乐成长。\\n\\n7. **小象启智（Little Elephant Wisdom）**  \\n   适合早教或益智类玩具，强调启蒙教育。\\n\\n8. **童趣工场（Kids Fun Factory）**  \\n   简洁明了，突出“童趣”和“创造力”。\\n\\n9. **魔法小屋（Magic Little House）**  \\n   充满神秘与想象，适合童话风格玩具。\\n\\n10. **豆芽童趣（Little Sprout Play）**  \\n   寓意孩子像小芽一样茁壮成长。\\n\\n---\\n\\n### 🌍英文名字推荐（适合国际化品牌）：\\n\\n1. **Kiddopia**（Kids + Utopia）  \\n   意为“孩子的理想国”。\\n\\n2. **Toytopia**  \\n   玩具乌托邦，充满想象和乐趣。\\n\\n3. **WonderWiggle**  \\n   表达“奇妙与活力”，适合婴幼儿玩具。\\n\\n4. **PlayMagineers**（Play + Imagineers）  \\n   玩中学，创意无限。\\n\\n5. **Lil’ Genius**  \\n   小天才，适合益智类玩具品牌。\\n\\n6. **FunBrix**  \\n   趣味积木风，适合建构类玩具。\\n\\n7. **Toytanic**（Toy + Titanic）  \\n   玩具界的巨轮，象征规模与品质。\\n\\n8. **KiddoCraft**  \\n   突出手工、创意、亲子互动。\\n\\n---\\n\\n如果你能提供更多品牌定位信息（比如目标年龄层、主打产品类型、是否注重教育意义等），我可以为你定制更贴切的名字哦！\\n\\n需要我帮你设计LOGO风格或品牌口号也可以告诉我～'}]"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "llm_chain.apply([\n",
    "    {\"product\":\"儿童玩具\"},\n",
    "])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "0ed56609-0ad7-4535-9957-fe3386e4bb3d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "generations=[[ChatGeneration(text='为一家儿童玩具公司起名时，名字应具备以下特点：\\n\\n- **可爱、富有童趣**  \\n- **容易记忆和发音**  \\n- **富有创意，激发想象力**  \\n- **体现快乐、安全、成长等正向价值观**  \\n- **适合品牌长期发展**\\n\\n以下是一些适合儿童玩具公司的名字建议，按风格分类：\\n\\n---\\n\\n### 🌈 **温馨可爱风格**\\n1. **小乐宝玩具**（寓意快乐的宝贝）\\n2. **童趣星球**（充满童趣的奇妙世界）\\n3. **咕噜糖玩具**（听起来很有趣、甜蜜）\\n4. **小象乐园**（象征聪明、可爱）\\n5. **泡泡糖童话**（梦幻、甜蜜、充满想象力）\\n\\n---\\n\\n### 🚀 **创意科技风格（适合益智/智能玩具）**\\n1. **奇思工坊**（激发孩子的创造力）\\n2. **智趣星球**（智慧与趣味结合）\\n3. **未来小玩家**（面向未来，鼓励探索）\\n4. **乐高乐园外的创意屋**（可作为副品牌或项目名）\\n5. **魔方童趣**（融合智力游戏与童真）\\n\\n---\\n\\n### 🌟 **英文风格（适合国际化品牌）**\\n1. **Toytale**（Toy + Tale，玩具童话）\\n2. **Kiddly**（活泼、可爱、简短）\\n3. **JoyJoy Toys**（双“Joy”，寓意双重快乐）\\n4. **Lil’Wonders**（小小奇迹，适合早教类玩具）\\n5. **Funville**（Fun + Ville，快乐小镇）\\n\\n---\\n\\n### 🧸 **中文诗意/寓意型**\\n1. **童梦成真**（实现孩子的梦想）\\n2. **乐玩童年**（快乐玩耍，美好童年）\\n3. **童行世界**（陪伴孩子探索世界）\\n4. **小鲸鱼玩具屋**（温柔、有想象力）\\n5. **彩虹城堡**（梦幻、多彩、童趣）\\n\\n---\\n\\n### 🎁 如果你有特定的品牌定位或产品类型（如：毛绒玩具、益智积木、遥控玩具等），我也可以根据方向进一步定制名字。\\n\\n你想要中文名还是英文名？有没有偏好的风格或核心理念？我可以继续帮你优化！', generation_info={'finish_reason': 'stop', 'logprobs': None}, message=AIMessage(content='为一家儿童玩具公司起名时，名字应具备以下特点：\\n\\n- **可爱、富有童趣**  \\n- **容易记忆和发音**  \\n- **富有创意，激发想象力**  \\n- **体现快乐、安全、成长等正向价值观**  \\n- **适合品牌长期发展**\\n\\n以下是一些适合儿童玩具公司的名字建议，按风格分类：\\n\\n---\\n\\n### 🌈 **温馨可爱风格**\\n1. **小乐宝玩具**（寓意快乐的宝贝）\\n2. **童趣星球**（充满童趣的奇妙世界）\\n3. **咕噜糖玩具**（听起来很有趣、甜蜜）\\n4. **小象乐园**（象征聪明、可爱）\\n5. **泡泡糖童话**（梦幻、甜蜜、充满想象力）\\n\\n---\\n\\n### 🚀 **创意科技风格（适合益智/智能玩具）**\\n1. **奇思工坊**（激发孩子的创造力）\\n2. **智趣星球**（智慧与趣味结合）\\n3. **未来小玩家**（面向未来，鼓励探索）\\n4. **乐高乐园外的创意屋**（可作为副品牌或项目名）\\n5. **魔方童趣**（融合智力游戏与童真）\\n\\n---\\n\\n### 🌟 **英文风格（适合国际化品牌）**\\n1. **Toytale**（Toy + Tale，玩具童话）\\n2. **Kiddly**（活泼、可爱、简短）\\n3. **JoyJoy Toys**（双“Joy”，寓意双重快乐）\\n4. **Lil’Wonders**（小小奇迹，适合早教类玩具）\\n5. **Funville**（Fun + Ville，快乐小镇）\\n\\n---\\n\\n### 🧸 **中文诗意/寓意型**\\n1. **童梦成真**（实现孩子的梦想）\\n2. **乐玩童年**（快乐玩耍，美好童年）\\n3. **童行世界**（陪伴孩子探索世界）\\n4. **小鲸鱼玩具屋**（温柔、有想象力）\\n5. **彩虹城堡**（梦幻、多彩、童趣）\\n\\n---\\n\\n### 🎁 如果你有特定的品牌定位或产品类型（如：毛绒玩具、益智积木、遥控玩具等），我也可以根据方向进一步定制名字。\\n\\n你想要中文名还是英文名？有没有偏好的风格或核心理念？我可以继续帮你优化！', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 485, 'prompt_tokens': 22, 'total_tokens': 507, 'completion_tokens_details': None, 'prompt_tokens_details': {'audio_tokens': None, 'cached_tokens': 0}}, 'model_name': 'qwen-plus', 'system_fingerprint': None, 'id': 'chatcmpl-e82e87cb-2128-9a15-812d-2190e356115a', 'service_tier': None, 'finish_reason': 'stop', 'logprobs': None}, id='run--77ffa11d-ee06-47b1-be7a-de7d4cba4af8-0', usage_metadata={'input_tokens': 22, 'output_tokens': 485, 'total_tokens': 507, 'input_token_details': {'cache_read': 0}, 'output_token_details': {}}))]] llm_output={'token_usage': {'completion_tokens': 485, 'prompt_tokens': 22, 'total_tokens': 507, 'prompt_tokens_details': {'audio_tokens': None, 'cached_tokens': 0}}, 'model_name': 'qwen-plus'} run=[RunInfo(run_id=UUID('77ffa11d-ee06-47b1-be7a-de7d4cba4af8'))] type='LLMResult'\n"
     ]
    }
   ],
   "source": [
    "a = llm_chain.generate([\n",
    "    {\"product\":\"儿童玩具\"},\n",
    "])\n",
    "print(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "8d6821e8-205d-4ca0-af27-183afbad7b70",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new LLMChain chain...\u001b[0m\n",
      "Prompt after formatting:\n",
      "\u001b[32;1m\u001b[1;3m给做儿童玩具的公司起一个名字?\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'为儿童玩具公司起名时，名字需要符合以下特点：\\n\\n- **可爱、有趣、富有童趣**\\n- **容易记忆和发音**\\n- **体现创造力、想象力、快乐等元素**\\n- **适合目标市场（如国内或国际）**\\n\\n以下是一些创意儿童玩具公司名称建议（中英文可选）：\\n\\n---\\n\\n### ✅ 中文名字建议：\\n\\n1. **乐奇玩具（Happy奇趣）**  \\n   含义：快乐+奇妙，寓意玩具能带来奇思妙想与快乐体验。\\n\\n2. **童趣工坊**  \\n   含义：专为儿童打造的创意玩具工厂，充满童真与手工感。\\n\\n3. **小象乐园**  \\n   含义：象象征聪明、可爱，乐园代表快乐玩耍的地方。\\n\\n4. **奇乐星球**  \\n   含义：一个充满奇妙与快乐的星球，适合有科技感或幻想风格的玩具。\\n\\n5. **泡泡兔玩具**  \\n   含义：兔子象征可爱、活泼，泡泡代表梦幻与童趣。\\n\\n6. **智趣岛**  \\n   含义：智慧与趣味结合，适合教育类或益智类玩具。\\n\\n7. **小鲸鱼乐园**  \\n   含义：鲸鱼象征梦想与广阔，适合激发孩子想象力的玩具品牌。\\n\\n8. **彩虹工坊**  \\n   含义：色彩丰富、创意无限，适合手工类或DIY玩具。\\n\\n9. **魔乐盒子**  \\n   含义：魔法+快乐+盒子，暗示每次打开都有惊喜。\\n\\n10. **跳跳糖玩具**  \\n   含义：活泼、跳跃、充满能量，适合动感玩具或儿童互动类玩具。\\n\\n---\\n\\n### ✅ 英文名字建议（适合国际化品牌）：\\n\\n1. **Toytastic**  \\n   含义：Toy + Fantastic，意为“令人惊叹的玩具”。\\n\\n2. **Kidoodle**  \\n   含义：Kid + Doodle（涂鸦），寓意孩子自由创意与玩耍。\\n\\n3. **PlayBloom**  \\n   含义：Play + Bloom（成长），寓意玩具帮助孩子成长发展。\\n\\n4. **WonderToys**  \\n   含义：充满奇迹的玩具，强调创意与想象。\\n\\n5. **FunzyLand**  \\n   含义：Fun + Crazy，一个充满欢乐的玩具世界。\\n\\n6. **TinyMinds**  \\n   含义：为小小头脑打造的玩具，适合益智类产品。\\n\\n7. **JollyJoy**  \\n   含义：快乐的快乐，朗朗上口，适合亲子类玩具。\\n\\n8. **Zoobly**  \\n   含义：自创词，听起来可爱、有趣，适合卡通风格玩具。\\n\\n---\\n\\n### ✅ 命名技巧小贴士：\\n\\n- 可以结合**动物**（如熊、兔、象）、**颜色**（蓝、红、彩虹）、**情感词**（乐、奇、梦）等元素。\\n- 考虑是否注册商标及域名（如：kidoodle.com 是否可用）。\\n- 如果是主打**益智、教育类玩具**，可以偏向“智慧”“成长”类词汇。\\n- 如果是**手工、创意类玩具**，可以偏向“工坊”“创意”“DIY”等概念。\\n\\n---\\n\\n如果你能提供更多背景信息（如公司定位、产品类型、目标人群），我可以帮你进一步定制名字哦！'"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "llm_chain.predict(product=\"儿童玩具\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "bf267751-53a8-4ccf-8110-1cfe6f4c1ef0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Collecting numexpr\n",
      "  Downloading numexpr-2.11.0-cp310-cp310-win_amd64.whl.metadata (9.2 kB)\n",
      "Requirement already satisfied: numpy>=1.23.0 in d:\\conda_envs\\rag_learn\\lib\\site-packages (from numexpr) (2.2.6)\n",
      "Downloading numexpr-2.11.0-cp310-cp310-win_amd64.whl (146 kB)\n",
      "Installing collected packages: numexpr\n",
      "Successfully installed numexpr-2.11.0\n",
      "Note: you may need to restart the kernel to use updated packages.\n"
     ]
    }
   ],
   "source": [
    "%pip install numexpr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "10d099b0-6234-437f-b766-4358dcdf091a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "使用新的 LLM Math Chain 方式\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\27727\\AppData\\Local\\Temp\\ipykernel_4520\\2634916197.py:17: LangChainDeprecationWarning: The class `ChatOpenAI` was deprecated in LangChain 0.0.10 and will be removed in 1.0. An updated version of the class exists in the :class:`~langchain-openai package and should be used instead. To use it run `pip install -U :class:`~langchain-openai` and import as `from :class:`~langchain_openai import ChatOpenAI``.\n",
      "  llm = ChatOpenAI(\n",
      "C:\\Users\\27727\\AppData\\Local\\Temp\\ipykernel_4520\\2634916197.py:28: LangChainDeprecationWarning: The method `Chain.run` was deprecated in langchain 0.1.0 and will be removed in 1.0. Use :meth:`~invoke` instead.\n",
      "  result = chain.run(\"2+6等于几?\")\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Answer: 8\n"
     ]
    }
   ],
   "source": [
    "# print(\"使用文件加载专用chains\")\n",
    "# from langchain.chains import load_chain\n",
    "\n",
    "# chain = load_chain(\"lc://chains/llm-math/chain.json\")\n",
    "\n",
    "# print(chain.run(\"2+6等于几?\"))\n",
    "# 执行上面的代码会报\"RuntimeError: Loading from the deprecated github-based Hub is no longer supported. Please use the new LangChain Hub at https://smith.langchain.com/hub instead.\"\n",
    "# 因为这个错误是因为 LangChain 已经弃用了从 GitHub Hub 加载链的方式，并迁移到了新的 LangChain Hub 平台\n",
    "\n",
    "print(\"使用新的 LLM Math Chain 方式\")\n",
    "from langchain.chains import LLMMathChain\n",
    "# from langchain_community.llms import OpenAI  # 或其他支持的LLM\n",
    "from langchain_community.chat_models import ChatOpenAI\n",
    "\n",
    "# 初始化LLM\n",
    "# llm = OpenAI(temperature=0)  # 需要设置OPENAI_API_KEY环境变量\n",
    "llm = ChatOpenAI(\n",
    "    model=\"qwen-plus\",  # 使用通义千问 plus 模型\n",
    "    temperature=0,      # 温度为0，确保输出确定性\n",
    "    openai_api_key=\"sk-4e88cf4db3e14894bafaff606d296610\",\n",
    "    openai_api_base=\"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n",
    ")\n",
    "\n",
    "# 创建数学链\n",
    "chain = LLMMathChain.from_llm(llm)\n",
    "\n",
    "# 运行链\n",
    "result = chain.run(\"2+6等于几?\")\n",
    "print(result)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "52193ddb-5ee5-4e7b-a808-6563bea4f993",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CustomChain：当通用链不满足的时候，可以自行构建来实现特定的目的\n",
      "# 降本增效\n",
      "\n",
      "**降本增效**是一个广泛应用于企业管理、政府管理及各类组织运营中的术语，指的是通过优化资源配置、改进流程、提升效率等方式，降低运营成本并提高产出效益。这一理念在经济环境多变、资源约束加剧的背景下，受到越来越多组织的重视。\n",
      "\n",
      "---\n",
      "\n",
      "## 目录\n",
      "\n",
      "1. [定义与内涵](#定义与内涵)  \n",
      "2. [背景与发展](#背景与发展)  \n",
      "3. [实施路径](#实施路径)  \n",
      "4. [应用领域](#应用领域)  \n",
      "5. [案例分析](#案例分析)  \n",
      "6. [挑战与对策](#挑战与对策)  \n",
      "7. [相关概念](#相关概念)  \n",
      "8. [参考资料](#参考资料)\n",
      "\n",
      "---\n",
      "\n",
      "## 定义与内涵\n",
      "\n",
      "“降本”即降低成本，指通过控制人力、物力、财力等资源消耗，减少不必要的支出；“增效”即提高效率或效益，强调在相同或更少投入下实现更高产出或更优服务。\n",
      "\n",
      "降本增效的核心目标是通过系统性优化，提升组织的竞争力和可持续发展能力。它不仅关注短期成本削减，更注重长期效益的提升。\n",
      "\n",
      "---\n",
      "\n",
      "## 背景与发展\n",
      "\n",
      "随着全球经济一体化和市场竞争的加剧，企业面临日益严峻的成本压力和效率挑战。特别是在经济下行周期中，降本增效成为组织应对不确定性、提升抗风险能力的重要手段。\n",
      "\n",
      "在中国，降本增效的概念最早在国有企业改革中被广泛提及。近年来，随着数字化转型、人工智能和自动化技术的发展，降本增效的手段也不断丰富和升级。\n",
      "\n",
      "---\n",
      "\n",
      "## 实施路径\n",
      "\n",
      "降本增效的实施通常包括以下几个方面：\n",
      "\n",
      "### 1. 流程优化\n",
      "通过流程再造（BPR）、精益管理（Lean）、六西格玛等方法，识别并消除流程中的冗余环节，提高工作效率。\n",
      "\n",
      "### 2. 技术创新\n",
      "引入自动化、人工智能、大数据分析等技术手段，提升生产效率，减少人工成本。\n",
      "\n",
      "### 3. 资源整合\n",
      "优化资源配置，例如集中采购、共享服务、外包非核心业务等，降低单位成本。\n",
      "\n",
      "### 4. 组织结构优化\n",
      "通过组织扁平化、岗位职责清晰化等方式，减少管理层级，提升决策效率。\n",
      "\n",
      "### 5. 绩效管理\n",
      "建立科学的绩效考核体系，激励员工提升工作绩效，同时控制人力成本。\n",
      "\n",
      "---\n",
      "\n",
      "## 应用领域\n",
      "\n",
      "降本增效广泛应用于以下领域：\n",
      "\n",
      "- **制造业**：通过精益生产、智能制造等方式降低成本、提高产能。\n",
      "- **服务业**：优化客户流程、提升服务质量的同时降低运营成本。\n",
      "- **公共管理**：政府机构通过数字化转型和流程再造提高公共服务效率。\n",
      "- **教育与医疗**：通过信息化手段提升资源利用效率，改善服务质量。\n",
      "- **金融行业**：通过金融科技手段降低运营成本，提升客户体验。\n",
      "\n",
      "---\n",
      "\n",
      "## 案例分析\n",
      "\n",
      "### 案例一：海尔集团的“人单合一”模式\n",
      "\n",
      "海尔集团通过“人单合一”模式，将员工与用户需求直接对接，减少中间环节，提升响应速度与效率。这一模式有效降低了管理成本，同时提升了产品和服务的市场适应性。\n",
      "\n",
      "### 案例二：某地方政府的“一网通办”\n",
      "\n",
      "某地政府通过建设“一网通办”政务服务平台，整合多个部门服务流程，简化审批流程，大幅缩短了企业开办时间，提高了行政效率，降低了政府运行成本。\n",
      "\n",
      "---\n",
      "\n",
      "## 挑战与对策\n",
      "\n",
      "尽管降本增效具有显著优势，但在实施过程中也可能面临以下挑战：\n",
      "\n",
      "- **员工抵触**：流程优化可能导致岗位调整，引发员工不满。\n",
      "- **短期压力**：成本削减可能影响短期业务发展。\n",
      "- **技术风险**：新技术应用存在不确定性，可能导致投资失败。\n",
      "- **质量下降**：过度追求成本控制可能影响产品或服务质量。\n",
      "\n",
      "**对策建议**：\n",
      "\n",
      "- 加强沟通与培训，提升员工认同感；\n",
      "- 制定阶段性目标，避免“一刀切”；\n",
      "- 强化风险管理，评估技术应用可行性；\n",
      "- 建立质量监控机制，确保效益与质量并重。\n",
      "\n",
      "---\n",
      "\n",
      "## 相关概念\n",
      "\n",
      "- **精益管理（Lean Management）**：以最小资源投入创造最大客户价值的管理理念。\n",
      "- **六西格玛（Six Sigma）**：一种以数据为基础、追求几乎完美质量的管理方法。\n",
      "- **流程再造（Business Process Reengineering）**：对业务流程进行根本性再思考与彻底重构。\n",
      "- **数字化转型（Digital Transformation）**：利用数字技术推动组织运营模式变革。\n",
      "\n",
      "---\n",
      "\n",
      "## 参考资料\n",
      "\n",
      "1. 王石, 万科集团降本增效实践研究, 《中国企业管理》, 2020年第3期  \n",
      "2. 李善民, 企业流程优化与成本控制, 机械工业出版社, 2018年  \n",
      "3. Porter, M. E. (1985). *Competitive Advantage: Creating and Sustaining Superior Performance*. Free Press.  \n",
      "4. Davenport, T. H. (2005). *Process Innovation: Reengineering Work Through Information Technology*. Harvard Business Review Press.  \n",
      "5. 中国政府网，《“放管服”改革典型案例汇编》, 2021年\n",
      "\n",
      "---\n",
      "\n",
      "> **注意**：本文为维基百科风格的模拟文章，内容为原创整理，仅供参考。如需引用，请注明来源。\n"
     ]
    }
   ],
   "source": [
    "# CustomChain：当通用链不满足的时候，可以自行构建来实现特定的目的\n",
    "from typing import List, Dict, Any, Optional\n",
    "from langchain.callbacks.manager import (\n",
    "    CallbackManagerForChainRun\n",
    ")\n",
    "from langchain.chains.base import  Chain\n",
    "from langchain.prompts.base import BasePromptTemplate\n",
    "from langchain.base_language import  BaseLanguageModel\n",
    "from langchain.chat_models import  ChatOpenAI\n",
    "from langchain.prompts import  PromptTemplate\n",
    "\n",
    "class wiki_article_chain(Chain):\n",
    "    \"\"\"开发一个wiki文章生成器\"\"\"\n",
    "    prompt:BasePromptTemplate\n",
    "    llm:BaseLanguageModel\n",
    "    out_key:str=\"text\"\n",
    "\n",
    "    @property\n",
    "    def input_keys(self) -> List[str]:\n",
    "        \"\"\"将返回Prompt所需的所有键\"\"\"\n",
    "        return self.prompt.input_variables\n",
    "    \n",
    "    @property\n",
    "    def output_keys(self) -> List[str]:\n",
    "        \"\"\"将始终返回text键\"\"\"\n",
    "        return [self.out_key]\n",
    "    \n",
    "    def _call(\n",
    "        self,\n",
    "        inputs:Dict[str,Any],\n",
    "        run_manager:Optional[CallbackManagerForChainRun]=None,\n",
    "    ) -> Dict[str,Any]:\n",
    "        \"\"\"运行链\"\"\"\n",
    "        prompt_value = self.prompt.format_prompt(**inputs)\n",
    "        #print(\"prompt_value:\",prompt_value)\n",
    "        response = self.llm.generate_prompt(\n",
    "            [prompt_value],callbacks=run_manager.get_child() if run_manager else None\n",
    "        )\n",
    "        #print(\"response:\",response)\n",
    "        if run_manager:\n",
    "            run_manager.on_text(\"wiki article is written\")\n",
    "        return {self.out_key:response.generations[0][0].text}\n",
    "    \n",
    "    @property\n",
    "    def _chain_type(self) -> str:\n",
    "        \"\"\"链类型\"\"\"\n",
    "        return \"wiki_article_chain\"\n",
    "       \n",
    "chain = wiki_article_chain(\n",
    "    prompt=PromptTemplate(\n",
    "        template=\"写一篇关于{topic}的维基百科形式的文章\",\n",
    "        input_variables=[\"topic\"]\n",
    "    ),\n",
    "    # llm=ChatOpenAI(\n",
    "    #     temperature=0\n",
    "    # ),\n",
    "    llm = ChatOpenAI(\n",
    "        model=\"qwen-plus\",  # 使用通义千问 plus 模型\n",
    "        temperature=0,      # 温度为0，确保输出确定性\n",
    "        openai_api_key=\"sk-4e88cf4db3e14894bafaff606d296610\",\n",
    "        openai_api_base=\"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n",
    "    )\n",
    ")\n",
    "print(\"CustomChain：当通用链不满足的时候，可以自行构建来实现特定的目的\")\n",
    "result = chain.run({\"topic\":\"降本增效\"})\n",
    "print(result)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "f72217fd-6db0-4630-8e06-f16be16f4a92",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "stuffChain：最常见的文档链，将文档直接塞进prompt中，为LLM回答问题提供上下文资料，适合小文档场景\n",
      "蒂法·洛克哈特是《最终幻想VII》及其补完作品中的重要女性角色，由野村哲也设计。她是主角克劳德的青梅竹马，经营反抗组织“雪崩”的据点“第七天堂”，擅长格斗，性格坚强独立，兼具温柔与战斗力。她在游戏中协助克劳德找回自我，并在后续作品中继续扮演关键角色，如《降临之子》中照顾孩子并支持克劳德。\n",
      "\n",
      "蒂法因其出色的个性塑造和形象设计广受好评，被认为是电子游戏中最具代表性的女性角色之一。她不仅在《最终幻想》系列中多次登场，也在其他游戏中作为客串角色出现。她的名字寓意深刻，象征爱与牺牲，与其角色设定高度契合。\n"
     ]
    }
   ],
   "source": [
    "# stuffChain：最常见的文档链，将文档直接塞进prompt中，为LLM回答问题提供上下文资料，适合小文档场景\n",
    "from langchain.chains.combine_documents.stuff import StuffDocumentsChain\n",
    "from langchain.chains import LLMChain\n",
    "from langchain.prompts import PromptTemplate\n",
    "from langchain.document_loaders import  PyPDFLoader\n",
    "from langchain.chat_models import ChatOpenAI\n",
    "\n",
    "loader = PyPDFLoader(\"kecheng/loader.pdf\")\n",
    "#print(loader.load())\n",
    "\n",
    "prompt_template = \"\"\"对以下文字做简洁的总结:\n",
    "{text}\n",
    "简洁的总结:\"\"\"\n",
    "\n",
    "prompt = PromptTemplate.from_template(prompt_template)\n",
    "# llm = ChatOpenAI(\n",
    "#     temperature=0,\n",
    "#     model=\"gpt-4-1106-preview\",\n",
    "# )\n",
    "llm = ChatOpenAI(\n",
    "    model=\"qwen-plus\",  # 使用通义千问 plus 模型\n",
    "    temperature=0,      # 温度为0，确保输出确定性\n",
    "    openai_api_key=\"sk-4e88cf4db3e14894bafaff606d296610\",\n",
    "    openai_api_base=\"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n",
    ")\n",
    "llm_chain = LLMChain(llm=llm, prompt=prompt)\n",
    "\n",
    "stuff_chain = StuffDocumentsChain(\n",
    "    llm_chain=llm_chain,\n",
    "    document_variable_name=\"text\",\n",
    ")\n",
    "docs = loader.load()\n",
    "print(\"stuffChain：最常见的文档链，将文档直接塞进prompt中，为LLM回答问题提供上下文资料，适合小文档场景\")\n",
    "print(stuff_chain.run(docs))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "043771bb-a6c9-489d-bdbe-756c931d240b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new StuffDocumentsChain chain...\u001b[0m\n",
      "\n",
      "\n",
      "\u001b[1m> Entering new LLMChain chain...\u001b[0m\n",
      "Prompt after formatting:\n",
      "\u001b[32;1m\u001b[1;3mWrite a concise summary of the following:\n",
      "\n",
      "\n",
      "\"蒂法介绍\n",
      "蒂法· 洛克哈特（⽇语：ティファ・ロックハート，Tifa Rokkuhāto，英语：Tifa \n",
      "Lockhart）为电⼦游戏《最终幻想VII》及《最终幻想VII补完计划》相关作品中的虚构⻆\n",
      "⾊，由野村哲也创作和设计，此后也在多个游戏中客串登场。\n",
      "2014年东京电玩展上，星名美津纪cosplay《最终幻想VII 降临之⼦》中的蒂法· 洛克哈特\n",
      "蒂法是克劳德的⻘梅⽵⻢，两⼈同为尼布鲁海姆出身。在⽶德加经营作为反抗组织“雪崩”根\n",
      "据地的酒馆“第七天堂”，并且是⼩有名⽓的招牌店员。擅⻓格⽃，以拳套为武器。本传7年前\n",
      "克劳德离开故乡从军时，曾许下约定“如果有危机时⼀定会保护她”。与爱丽丝相识之后，两\n",
      "⼈成为好友。第⼀个察觉克劳德记忆混乱的⼈，后来协助精神崩溃的克劳德重新找回真正的⾃\n",
      "⼰。本传的⼤战结束后，依⼤家的期待在战后新⽣的⽶德加再次开设第七天堂（原第七天堂因\n",
      "第柒区圆盘崩塌遭压毁），同时也照顾⼀群受到星痕症候群折磨的孩⼦们。\n",
      "蒂法被《纽约时报》称为“⽹络⼀代”的海报⼥郎，与劳拉· 克罗夫特相⽐，她是电⼦游戏中坚\n",
      "强、独⽴和有吸引⼒的⼥性⻆⾊的典型代表。媒体普遍称赞其实⼒和外表，并称她为游戏世界\n",
      "中最好的⼥性⻆⾊之⼀。\n",
      "在《最终幻想VII》本传中，蒂法年龄20岁、身⾼167cm、⽣⽇5⽉3⽇、⾎型B型、出⽣地尼\n",
      "布尔海姆。\n",
      "登场\n",
      "《最终幻想VII》\n",
      "蒂法在《最终幻想VII》原版中⾸次亮相，是克劳德的⻘梅⽵⻢、第七天堂酒吧的看板娘、极\n",
      "端环境组织“雪崩”成员，该组织反抗巨型企业“神罗”因其⼤量抽取魔晄⽤作动⼒能源。在注\n",
      "意到克劳德的性格改变后，她说服克劳德加⼊雪崩，以密切关注他，并且跟随他追寻游戏中的\n",
      "对⼿萨菲罗斯。她⽆法阻⽌克劳德被萨菲罗斯操纵，在他的精神崩溃后，她帮助克劳德康复，\n",
      "并且两⼈意识到彼此间的相互感觉，最后与伙伴们⼀同击败了萨菲罗斯。[2]\n",
      "在闪回中可知，⼉时的蒂法⼀直是村中⼩孩的⼈⽓王。在⺟亲过世后，思念⺟亲的蒂法决定沿\n",
      "着⼩路⾛到他们故乡尼布尔海姆附近的⼀座⼭上，认为这样就能⻅到过世的⺟亲，原本跟着蒂\n",
      "法的其他⼩孩都在半路上因害怕⽽放弃，唯独克劳德仍坚定的在后⾯跟随，希望能在危机时保\n",
      "护蒂法。然⽽，他们俩都从⼭上跌落受伤，蒂法昏迷了⼀个星期，她的⽗亲认为克劳德对此负\n",
      "有责任[3]，甚为严令禁⽌克劳德再接近蒂法，但蒂法反⽽从此更在意克劳德，两⼈成为要好\n",
      "的玩伴。为了使⾃⼰变得更强⼤，克劳德最终选择离开尼布尔海姆，加⼊神罗，想要成为神罗\n",
      "的精英战⼠“神罗战⼠”（SOLDIER），但后来透露他主要是为了吸引蒂法的注意⼒。离开之\n",
      "前，蒂法与克劳德约定，当蒂法处于困境之中时，克劳德会回来救她。从克劳德离开之后，蒂\n",
      "法便开始留意神罗战⼠的消息，因为神罗战⼠都成为声名远播的知名⼈物，如果克劳德成为神\n",
      "罗战⼠，他的活跃也会⽴刻传回尼布尔海姆。数年后，在萨菲罗斯摧毁了尼布尔海姆之后，克\n",
      "劳德为了救蒂法，被萨菲罗斯刺⾄重伤。蒂法被她的武术教练赞⼲带到安全地带，幸存下来，\n",
      "最终到达⽶德加并遇⻅了“雪崩”的领导⼈巴雷特· 华莱⼠。病愈后，蒂法加⼊了“雪崩”，为\n",
      "了给家乡被毁⼀事报仇。⼀天，她在⽕⻋站遇到了从魔晄炉中逃出来、精神⼀⽚混乱的克劳\n",
      "德，蒂法说服了他为巴雷特⼯作，以保证克劳德的安全以及和克劳德保持紧密关系。这是游戏\n",
      "开始的地⽅。\n",
      "在原版《最终幻想VII》中蒂法与爱丽丝关系友好，但会在某些时候争⻛吃醋，例如在神罗总\n",
      "部营救爱丽丝时，蒂法及巴雷特等⼀⾏失⼿被擒，若克劳德选择关⼼爱丽丝的话蒂法的对话中\n",
      "明显带有妒忌。在重制版中虽然删去这段情节，但保留了这种关系。\n",
      "在《最终幻想VII》的初稿中，蒂法是背景⼈物。她在“雪崩”中的作⽤是在幕后⽀持，在执\n",
      "⾏任务后为所有⼈加油⿎劲，并且对克劳德有特别的关⼼。据推测，她的背上有⼀块⼤的疤\n",
      "\n",
      "痕，是由克劳德造成的，并在事件发⽣时因巨⼤冲击⽽部分失忆。[4]原版策划者之⼀的加藤\n",
      "正⼈提出了⼀个旨在暗示蒂法和克劳德发⽣性关系的场景，但被北濑佳范⽤⼀个变淡的⾊调所\n",
      "取代。野岛⼀成在接受采访时说，没有⼀个开发团队⼈员认为当时的场景会成为⼀个问题。\n",
      "[5]\n",
      "《最终幻想VII补完计划》\n",
      "2005年，蒂法出现在CG电影《最终幻想VII 降临之⼦》中，故事发⽣在原版游戏剧情结束\n",
      "两年后。在其中，她试图给予克劳德情感上的⽀持，敦促克劳德放下他对⾃⼰施加的不必要的\n",
      "罪恶感。此外，她还照顾巴雷特的养⼥玛琳和克劳德在爱丽丝的教堂发⻔⼝救下的孩⼦丹泽\n",
      "尔。在电影中，她与萨菲罗斯的其中⼀个思念体罗兹战⽃，后来她帮助与被召唤的⽣物巴哈姆\n",
      "特战⽃。编剧野岛⼀成将她在视频中的⻆⾊描述为“⾮常像任何被男⼈抛弃的⼥⼈”，并表示\n",
      "尽管他们不希望她显得笨拙，但他们也想描绘出从她受到克劳德的情感伤害出发。[6]在视频\n",
      "的初稿中，她原本计划在当时的短⽚中扮演更重要的⻆⾊，该短⽚仅以蒂法，克劳德和⼏个孩\n",
      "⼦为主。\n",
      "蒂法也在前传游戏《最终幻想VII 危机之前》和《最终幻想VII 核⼼危机》以及OVA《最终\n",
      "幻想VII 最终命令》中登场。每次登场时，她的出现都与尼布尔海姆的毁灭有关。[2]官⽅\n",
      "⼩说《通向微笑之路》中有专⻔的《蒂法篇》，讲述了原版游戏和降临之⼦两段之间的故事。\n",
      "从蒂法的⻆度出发，详细讲述了她如何在Edge City创建⼀个新的第七天堂酒吧，并试图坚\n",
      "持⾃⼰和克劳德的正常家庭观念，尽管克劳德逐渐开始逃避与他⼈接触。蒂法还短暂出现在游\n",
      "戏《最终幻想VII 地狱⽝的挽歌》中，该游戏的剧情在降临之⼦故事⼀年后发⽣，她在游戏\n",
      "中帮助主⻆⽂森特· 瓦伦丁捍卫星球，抵抗怪物欧⽶茄和“兵器”。她后来出现在游戏的结尾\n",
      "中，讨论着⽂森特的失踪。[2]\n",
      "其他登场\n",
      "在《最终幻想VII补完计划》之外，蒂法还出现在格⽃游戏《神佑擂台》中，作为可解锁的⻆\n",
      "⾊和可选的Boss。[7]她后来出现在电⼦棋盘游戏《富豪街》中。在《王国之⼼II》中，她\n",
      "穿着⾃⼰在降临之⼦中的服装，寻找克劳德，然后与该系列的怪物“⽆⼼”战⽃。她原本计划\n",
      "出现在原版《王国之⼼》的最终合辑中，但由于时间限制，⼯作⼈员选择改⽤萨菲罗斯。[8]\n",
      "蒂法也是格⽃游戏《最终幻想 纷争012》中的玩家⻆⾊之⼀，该游戏的⻆⾊来⾃各种《最终\n",
      "幻想》游戏。[9]她身着《最终幻想VII》中的服装，但该玩家还可以使⽤她在《降临之⼦》\n",
      "中的服装和在尼布尔海姆出场时展示的第三种服装。[10][11]游戏的第⼀版展示内容是在天\n",
      "野喜孝的美术原型基础上展现的另⼀种形式。[12]在《⼩⼩⼤星球2》中，蒂法是可下载的\n",
      "⻆⾊模型。[13]\n",
      "韩国歌⼿Ivy在2007年的歌曲“ਬ഑੄ਬ഑੄”（《诱惑奏鸣曲》）MV中描绘了⻆⾊。因为重现\n",
      "了《降临之⼦》中的战⽃场⾯，在史克威尔艾尼克斯提出版权诉讼后，该视频被禁⽌在韩国电\n",
      "视上播出。[14] 2015年，蒂法作为可玩⻆⾊被添加到iOS游戏《最终幻想 记录者》中。\n",
      "[15]\n",
      "创作与发展\n",
      "蒂法在《最终幻想VII 核⼼危机》中的形象。\n",
      "蒂法由野村哲也设计，最初版本的《最终幻想VII》中没有蒂法，因为最初该游戏只有三个可\n",
      "玩⻆⾊。主⻆克劳德、爱丽丝和巴雷特。但是，在给游戏总监北濑佳范打电话时，有⼈建议游\n",
      "戏中的某个主⻆应该死掉，在对究竟是巴雷特还是爱丽丝需要死掉进⾏⼤量讨论之后，制⽚⼈\n",
      "选择了爱丽丝。[3]野村哲也后来开玩笑说这是他的主意，以便使他能够将蒂法引⼊游戏中。\n",
      "[16]⽆论如何，北濑佳范喜欢有两个的⼥主⼈公，并且在他们之间摇摆不定，将其称之为是\n",
      "\n",
      "《最终幻想》系列中的新事物。[5]野村哲也将蒂法的⻆⾊在《降临之⼦》中的表现分为多个\n",
      "⽅⾯，称她“像⺟亲，爱⼈，战⽃中的亲密盟友”，“不仅在情感上，⽽且在身体上也⾮常坚\n",
      "强”。[6]\n",
      "蒂法被设计为该系列以前的游戏中出现的“Monk”级别的⻆⾊。她有⼀头乌⿊的⻓发，像⼀头\n",
      "海豚的尾巴，穿着简单单调的服装，包括⽩⾊的上⾐和⿊⾊的超短裙。她还穿着红⾊的靴⼦和\n",
      "⼿套，⿊⾊的袖⼦从⼿腕延伸到肘部。她的裙⼦被⼀对狭窄的⿊⾊吊带裤撑起，⼤⾯积的⾦属\n",
      "护罩覆盖了她的左肘。她身⾼约167厘⽶[17]，三围为92-60-88厘⽶。[4]最初，野村哲也\n",
      "很难决定选择搭配迷你裙还是搭配⻓裤。为了征求意⻅，他在史克威尔的办公室传递了草图，\n",
      "⼤多数⼯作⼈员都认同超短裙设计。[16]这与爱丽丝的标志形成鲜明对⽐，爱丽丝的⻓裙是\n",
      "她的标志。服装在游戏中被解释为赋予了她⾏动⾃由的能⼒，这是由于她的近距离战⽃的亲和\n",
      "⼒，⽽裙⼦据称“相当短，具有相当⼤的曝光度”[4]。开发者还指出，由于她的身材，她穿\n",
      "着其他便⾐的外观也令⼈愉悦。[4]\n",
      "在制作《最终幻想VII 降临之⼦》时，联合导演野末武志难以为蒂法的身材构建出⼀个“平\n",
      "衡，但⼜展现了她的⼥性特质”的框架。在这⼀点上，她的服装也进⾏了重新设计，着重于表\n",
      "达这些品质，同时仍然令⼈赏⼼悦⽬。⽩⾊背⼼覆盖⿊⾊背⼼，⽩⾊缎带背⼼包裹着她的左⼆\n",
      "头肌，粉红丝带包裹着她的脚。⿊⾊系扣裙⼦遮盖了她的⼤腿，并且在下⾯穿了短裤，⽤⼀块\n",
      "类似于⼤⾐的布从裙⼦的腰带后部延伸到脚踝。她不再使⽤吊带撑起裙⼦，只在电影的战⽃场\n",
      "景中戴着⼿套。她的发型被更改为在她的背部中部结束，从原来的设计中删除了海豚的尾巴。\n",
      "[6]造成这种变化的原因是，难以为她的原始头发设置动画效果，以及由于其⿊⾊和亮光⽽引\n",
      "起的问题。另外，瞳孔的颜⾊亦由红⾊改为深褐⾊。\n",
      "蒂法在《最终幻想VII 重制版》中的形象。\n",
      "开发《最终幻想VII 重制版》时，史克威尔修改了蒂法的原始外观，以使她的外观更加逼\n",
      "真，因为⼯作⼈员意识到她的设计不适合战⽃场景。她因此得到了⿊⾊运动内⾐并贴合她的身\n",
      "体，给她⼀种运动的感觉。[18]在这个版本中的蒂法虽然保留着“海豚尾巴”发型，但原版中\n",
      "其末端如海豚尾鳍已变为更⾃然的垂直模样。另外,在第三章中,玩家可选三种服饰中的⼀种\n",
      "让蒂法在以后的篇章穿上。除了“成熟⻛”、“格⽃家⻛”及“异国⻛”外，开发团队亦考虑过\n",
      "“⼥仆⻛”、“警察服”、“舞蹈家⻛”、“陆⾏⻦⻛”等[19]。由于克劳德与蒂法和爱丽丝之间\n",
      "存在的特殊关系，开发团队观察到粉丝认为史克威尔更偏爱这两个⼥主⻆。以往，史克威尔表\n",
      "示爱丽丝可能是游戏的真正主⻆，⽽蒂法对于帮助克劳德这个⻆⾊的发展很重要。最终，史克\n",
      "威尔表示蒂法和爱丽丝都是这次重制版中的⼥主⻆。[20]\n",
      "野村哲也表示，他喜欢⼥演员伊藤步，并希望与她在《降临之⼦》中合作。在爱丽丝的配⾳演\n",
      "员已经决定之后，野村让伊藤步为蒂法配⾳，觉得她的“沙哑的声⾳”将与坂本真绫配⾳的轻\n",
      "声细语的爱丽丝形成很好的对⽐。[6]野村哲也还指出，在完成蒂法的更新设计后，制⽚⼈对\n",
      "她的最终细节进⾏了辩论，但伊藤步饰演⻆⾊后，便选择将配⾳演员的许多特征融合到⻆⾊的\n",
      "最终形象中。[6]\n",
      "英国配⾳演员瑞秋· 莱· 寇克（Rachael Leigh Cook）在《王国之⼼II》的⼀次采访中\n",
      "说，她喜欢玩蒂法，并形容她“身体和情感上都很强壮，但也⾮常敏感”，并且“⾮常多维”。\n",
      "[21]在给⻆⾊配⾳时，寇克听取了伊藤步的配⾳。在《降临之⼦》制作之后，寇克感谢野村\n",
      "哲也所创作的视频并表示⾮常喜欢。[22]布⾥特· 巴伦（Britt Baron）代替她参加了《最\n",
      "终幻想VII 重制版》的配⾳。[23]蒂法幼年时候由Glory Curda配⾳。[24]\n",
      "评价\n",
      "⾃登场以来，蒂法受到评论家和粉丝的极⼤好评。在2000年，GameSpot的读者将她评为电\n",
      "⼦游戏中的第五好的⼥性⻆⾊，该⽹站的编辑指出他们对此表示同意。[25] 2004年，\n",
      "\n",
      "《Play》杂志在《游戏⼥孩》年度期刊的第⼀期中介绍了蒂法，并称她为“近代史上最受崇\n",
      "拜的⼥性。”2007年，蒂法被《电击PlayStation》评为在原版PlayStation平台上有史\n",
      "以来第⼋好的⼈物，也是《最终幻想VII》中排名第三的⻆⾊。[26]同年，Tom's \n",
      "Hardware将她列为视频游戏历史上50个最伟⼤的⼥性⻆⾊之⼀，并称她为“周围⼈物中更丰\n",
      "富，更复杂的⼥性⻆⾊之⼀。”[27]在2008年，UGO将她列为电⼦游戏史上最伟⼤的⼥性⻆\n",
      "⾊之⼀，排在第五位，并表示对她的偏好超过了爱丽丝，并补充说：“ 蒂法的服装是轻描淡\n",
      "写的奇迹-但正是她的天⽣丽质和令⼈难忘的性格使她在榜单上名列前茅。”[28]同年，\n",
      "Chip杂志将她列为“游戏⼥孩”第⼗名。[29]2009年，IGN将蒂法列为游戏中⼗⼤最佳⼥主\n",
      "⻆之⼀，并称她为“毫⽆疑问的最终幻想宇宙中的传奇⼥主⻆。”[30] Fami通在2010年进\n",
      "⾏的⼀项⺠意调查将她评为第19⼤最受⽇本玩家欢迎的视频游戏⻆⾊。[31]在2013年，\n",
      "Complex将她列为电⼦游戏历史上第13⼤⼥主⻆。[32]\n",
      "2001年，随着劳拉· 克罗夫特的推出，Beaumont Enterprise列举了蒂法作为视频游戏中\n",
      "强⼤⼥性⻆⾊的榜样。2008年，Joystiq将她列为他们希望在史克威尔艾尼克斯的跨界格⽃\n",
      "游戏《最终幻想 纷争》中看到的《最终幻想》系列中20个⻆⾊中的佼佼者，并将她描述为该\n",
      "系列“最伟⼤的⼥主⻆”之⼀。[33]IGN在2008年将蒂法列⼊有史以来第13部最佳的《最终\n",
      "幻想》⻆⾊之⼀，描述她是史克威尔试图“赋予《最终幻想》⻆⾊真实的性感”的尝试，以及\n",
      "“可以在紧要关头照顾好⾃⼰”的⼈；在后续的读者选择榜单中，蒂法排名第⼀，⼯作⼈员在\n",
      "将其在榜单上的位置归因于她的胸部时重复了先前的评论。[34]在2009年IGN的⼀篇⽂章\n",
      "中，仅关注《最终幻想VII》中的⻆⾊，她排在第四位，并评论说，尽管她的性感提⾼了她的\n",
      "知名度，但“ 蒂法推动了坚强，独⽴的RPG⼥主⻆的传统。”[35]其他杂志也称赞蒂法的性\n",
      "格特征。Mania Entertainment在2010年“了不起的视频游戏⼥性”名单中，蒂法排名第\n",
      "⼗，并指出，虽然《最终幻想》系列的后续游戏引⼊了其他令⼈难忘的⼥性⻆⾊，但“蒂法是\n",
      "我们的第⼀个《最终幻想》⼥孩，并在我们⼼中有特殊的地位”。[36] 2013年，\n",
      "《Complex》的Gus Turner将蒂法列为有史以来⼗⼆⼤最终幻想⻆⾊之⼀，并指出“除了劳\n",
      "拉和萨姆斯· 艾仁之外，蒂法也代表了游戏中最独⽴，最有能⼒的⼥性之⼀。” [37]\n",
      "许多评论都认为蒂法⾮常性感。 1998年，《纽约时报》将她列为“⽹络⼀代”的炙⼿可热的\n",
      "海报⼥郎。[38]同年，《电⼦游戏⽉刊》授予她1997年的“最热⻔游戏宝⻉”，称她“⽐例匀\n",
      "称”，并称赞她是劳拉的另⼀可⾏选择。 UGO在2008年“电⼦游戏热⻔榜”中将她排在第24\n",
      "位，并补充说他们⽆法“克服之后的每个游戏版本中她的表现都更好”。[39]同年，\n",
      "GameDaily在“最热游戏辣妹”名单中将她排在第31位，分享了UGO对她的偏爱，并赞扬了她\n",
      "的外表和战⽃能⼒。[40]MSN也有类似的看法，当他们将“这个充满爱⼼，关怀，超级性感的\n",
      "⼥孩”列⼊“游戏界最热⻔的辣妹”名单中时，她名列第六，并指出她在该系列中的存在“有些\n",
      "微妙，给与了她更像是⼀种情感上的暗示。”⽽且没有她，这个系列就不会那么特别。\n",
      "[41]Manolith在2009年“最热⻔”⼥性视频游戏主⻆名单中将她排名第⼆。[42] 2010\n",
      "年，VideoGamer.com将她列为“⼗⼤电⼦游戏⼥神”，[43]⽽AfterEllen的塞拉· 沃恩\n",
      "（Sarah Warn）将她评为“第九⼤最热”⼥性电⼦游戏⻆⾊。[44]2011年，Complex将她\n",
      "列为“游戏中最漂亮的⼥性⻆⾊”第16名，[45]⽽UGO仅因她在《神佑擂台》中的出现⽽将她\n",
      "列为“格⽃游戏中最优秀的⼥性”中的第13位。[46]同年，GameFront将她的胸部排在“电⼦\n",
      "游戏史上最伟⼤的胸部”名单的第九位，称她为“存在的危机版劳拉；” [47]她也被\n",
      "Village Voice Media列⼊“不可思议的胸部名单”，但评论说她“不仅仅具有性感。”\n",
      "[48]2012年，Complex将她列为整体上“第⼆热⻔”视频游戏⻆⾊，[49]MSN将她列为“电\n",
      "⼦游戏史上最热⻔的20位⼥性”之⼀，并补充说“她是历史上最著名的游戏⼥孩之⼀，并且具\n",
      "有永恒的吸引⼒。” [50]2013年，《每⽇纪事报》的Scott Marley将她排在“最有魅⼒的\n",
      "⼥性电⼦游戏⻆⾊”第⼆位，[51]⽽CheatCodes.com则宣布她是有史以来“最热⻔的⼥性\n",
      "\n",
      "电⼦游戏⻆⾊”。[52]同样，《La NuevaEspaña》在2014年将“性感，独⽴和坚强”的蒂\n",
      "法列为男⼥最性感的⼗⼤电⼦游戏⻆⾊中，[53]⽽《ThanhNiên》在2015年将她评为最性\n",
      "感的⼥性电⼦游戏⻆⾊。[54]\n",
      "姓名由来\n",
      "蒂法（Tifa）的英⽂名字来源于⼀个古希伯来语单词“Tiferet” ，⽽姓⽒洛克哈特\n",
      "（Lockhart）则是英语单词Lock和Hard的结合；Tiferet是⽣命之树的⼀个成分（⽣命之\n",
      "树⼤概可以分为三⽀柱、⼗个原质、四个世界、⼆⼗⼆路径等基本结构），象征着爱情、美丽\n",
      "和⾃我牺牲，从游戏⾥可以看出，这⼏点都符合Tifa的情况。\"\n",
      "\n",
      "\n",
      "CONCISE SUMMARY:\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'蒂法·洛克哈特是《最终幻想VII》及其补完计划中的主要角色，由野村哲也设计。她是克劳德的青梅竹马，经营作为反抗组织“雪崩”据点的酒吧“第七天堂”，擅长格斗，性格坚强、独立且富有同情心。她在克劳德精神崩溃时给予支持，并协助他找回自我。蒂法在游戏和相关作品中广受好评，被视为电子游戏中最具代表性的女性角色之一，兼具实力与魅力。她也频繁出现在其他游戏中，如《王国之心II》《最终幻想 纷争》等，并因其性感形象和深刻角色塑造成为游戏界标志性人物。她的名字源自希伯来语“Tiferet”，象征爱与牺牲，与其角色特质相符。'"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#使用预封装好的load_summarize_chain（四种文档处理链之stuff）\n",
    "from langchain.document_loaders import  PyPDFLoader\n",
    "from langchain.chat_models import ChatOpenAI\n",
    "from langchain.chains.summarize import load_summarize_chain\n",
    "\n",
    "loader = PyPDFLoader(\"kecheng/loader.pdf\")\n",
    "docs = loader.load()\n",
    "# llm = ChatOpenAI(\n",
    "#     temperature=0,\n",
    "#     model=\"gpt-4-1106-preview\",\n",
    "# )\n",
    "llm = ChatOpenAI(\n",
    "    model=\"qwen-plus\",  # 使用通义千问 plus 模型\n",
    "    temperature=0,      # 温度为0，确保输出确定性\n",
    "    openai_api_key=\"sk-4e88cf4db3e14894bafaff606d296610\",\n",
    "    openai_api_base=\"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n",
    ")\n",
    "chain = load_summarize_chain(\n",
    "    llm=llm,\n",
    "    chain_type=\"stuff\",\n",
    "    verbose=True,\n",
    "    )\n",
    "\n",
    "chain.run(docs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "f4b536f8-5fc3-41db-a763-04ca92005f4a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "refine：通过循环引用LLM，将文档不断投喂，并产生各种中间答案，适合逻辑有上下文关联的文档，不适合交叉引用的文档\n",
      "蒂法·洛克哈特是《最终幻想VII》及系列作品中的重要女性角色，由野村哲也设计。她是主角克劳德的青梅竹马，经营着反抗组织“雪崩”的据点“第七天堂”酒吧，擅长格斗，以拳套为武器。在克劳德因记忆混乱而精神崩溃时，她帮助他恢复自我，并与他共同对抗敌人萨菲罗斯。\n",
      "\n",
      "蒂法性格坚强、独立，是游戏中最具代表性的女性角色之一，广受媒体好评。她出生于尼布尔海姆，20岁，生日为5月3日。在游戏剧情中，她与克劳德有着深厚的情感羁绊，同时也与爱丽丝形成微妙的竞争关系。\n",
      "\n",
      "除了本传作品，蒂法也在多个游戏中客串登场，成为电子游戏界的标志性角色之一。在《最终幻想VII补完计划》中，她在CG电影《最终幻想VII 降临之子》中出现，故事发生在原版游戏剧情结束两年后。在其中，她试图给予克劳德情感上的支持，敦促克劳德放下他对自我施加的不必要的罪恶感。此外，她还照顾巴雷特的养女玛琳和克劳德在爱丽丝的教堂门口救下的孩子丹泽尔。在电影中，她与萨菲罗斯的其中一个思念体罗兹战斗，后来帮助与被召唤的生物巴哈姆特战斗。编剧野岛一成将她在影片中的角色描述为“非常像任何被男人抛弃的女人”，并表示尽管他们不希望她显得笨拙，但也想描绘出她因情感伤害而展现出的脆弱一面。\n",
      "\n",
      "在前传作品《最终幻想VII 危机之前》和《最终幻想VII 核心危机》以及OVA《最终幻想VII 最终命令》中，蒂法也多次登场，每次都与尼布尔海姆的毁灭密切相关。官方小说《通向微笑之路》中的《蒂法篇》讲述了游戏与《降临之子》之间的故事，从她的视角展现了她在Edge City创建新“第七天堂”的努力，并试图维系一个看似正常的家庭，尽管克劳德逐渐疏远她。在《最终幻想VII 地狱犬的挽歌》中，她帮助主角文森特·瓦伦丁捍卫星球，抵抗怪物欧米茄和“兵器”，并在游戏结尾讨论文森特的失踪。\n",
      "\n",
      "在《最终幻想VII补完计划之外》，蒂法也活跃于多个跨界作品中。她在格斗游戏《神佑擂台》中作为可解锁角色和Boss登场；在《王国之心II》中，她穿着《降临之子》的服装寻找克劳德，并与“无心”战斗。她原计划出现在《王国之心》的最终合辑中，但因时间限制被萨菲罗斯取代。此外，她还出现在格斗游戏《最终幻想 纷争012》和游戏《小小大星球2》中，作为可玩或可下载角色。她也曾出现在韩国歌手Ivy的MV《诱惑奏鸣曲》中，但由于版权问题被禁播。2015年，她作为可玩角色加入iOS游戏《最终幻想 记录者》。\n",
      "\n",
      "蒂法最初并未出现在《最终幻想VII》的初始角色设定中，因为游戏最初只有克劳德、爱丽丝和巴雷特三个可玩角色。在关于角色死亡的讨论中，制片人决定让爱丽丝牺牲，这为蒂法的加入提供了机会。野村哲也开玩笑称这是他的主意，而北濑佳范也喜欢有两个女主角的设定。\n",
      "\n",
      "在角色设计方面，蒂法的外观经历了多次演变。最初她被设计为具有“Monk”风格的角色，身穿白色上衣、黑色超短裙、红色靴子和手套，身材高挑，三围比例引人注目。在《降临之子》中，她的服装被重新设计，以更好地展现她的女性特质和战斗实用性，发型也有所改变，去除了原本的“海豚尾”样式。瞳孔颜色由红色改为深褐色，以增强真实感。在《最终幻想VII 重制版》中，她的形象更加写实，服装也更具运动感。开发团队为她设计了多种风格的服装供玩家选择，并明确表示她与爱丽丝在重制版中都是女主角。\n",
      "\n",
      "在配音方面，日本版的蒂法由伊藤步配音，她的沙哑嗓音与爱丽丝（由坂本真绫配音）的温柔声音形成鲜明对比。导演野村哲也表示，伊藤步的特质被融入到角色的最终形象中。在英文版中，蒂法由瑞秋·莱·寇克配音，她称赞蒂法是一个“身体和情感上都很强壮，但也非常敏感”的多维角色。在《最终幻想VII 重制版》中，该角色由布里特·巴伦接替配音，而幼年蒂法则由Glory Curda配音。\n",
      "\n",
      "自登场以来，蒂法受到了评论家和粉丝的广泛好评。2000年，她被GameSpot读者评为电子游戏中第五好的女性角色，其形象、性格和剧情深度都深受喜爱。她不仅是一个战斗高手，也是一个充满情感与人性光辉的角色，是《最终幻想》系列中最受欢迎和标志性的女性角色之一。\n",
      "\n",
      "此外，她也被《Play》杂志在《游戏女孩》年度期刊的第一期中介绍，并被称为“近代史上最受崇拜的女性。”2007年，蒂法被《电击PlayStation》评为在原版PlayStation平台上有史以来第八好的人物，也是《最终幻想VII》中排名第三的角色。同年，Tom's Hardware将她列为视频游戏历史上50个最伟大的女性角色之一，并称她为“周围人物中更丰富，更复杂的女性角色之一。”在2008年，UGO将她列为电子游戏史上最伟大的女性角色之一，排在第五位，并表示对她的偏好超过了爱丽丝，并补充说：“蒂法的服装是轻描淡写的奇迹——但正是她的天生丽质和令人难忘的性格使她在榜单上名列前茅。”同年，Chip杂志将她列为“游戏女孩”第十名。2009年，IGN将蒂法列为游戏中十大最佳女主角之一，并称她为“毫无疑问的最终幻想宇宙中的传奇女主角。” Fami通在2010年进行的一项民意调查将她评为第19大最受日本玩家欢迎的视频游戏角色。在2013年，Complex将她列为电子游戏历史上第13大女主角。\n",
      "\n",
      "2001年，随着劳拉·克罗夫特的推出，Beaumont Enterprise列举了蒂法作为视频游戏中强大女性角色的榜样。2008年，Joystiq将她列为他们希望在史克威尔艾尼克斯的跨界格斗游戏《最终幻想 纷争》中看到的《最终幻想》系列中20个角色中的佼佼者，并将她描述为该系列“最伟大的女主角”之一。IGN在2008年将蒂法列入有史以来第13部最佳的《最终幻想》角色之一，描述她是史克威尔试图“赋予《最终幻想》角色真实的性感”的尝试，以及“可以在紧要关头照顾好自己”的人；在后续的读者选择榜单中，蒂法排名第—，工作人员在将其在榜单上的位置归因于她的胸部时重复了先前的评论。在2009年IGN的一篇文章中，仅关注《最终幻想VII》中的角色，她排在第四位，并评论说，尽管她的性感提高了她的知名度，但“蒂法推动了坚强，独立的RPG女主角的传统。”其他杂志也称赞蒂法的性格特征。Mania Entertainment在2010年“了不起的视频游戏女性”名单中，蒂法排名第⼗，并指出，虽然《最终幻想》系列的后续游戏引入了其他令人难忘的女性角色，但“蒂法是我们的第一个《最终幻想》女孩，并在我们心中有特殊的地位。” 2013年，《Complex》的Gus Turner将蒂法列为有史以来十二大最终幻想角色之一，并指出“除了劳拉和萨姆斯·艾仁之外，蒂法也代表了游戏中最独立，最有能力的女性之一。”\n",
      "\n",
      "许多评论都认为蒂法非常性感。1998年，《纽约时报》将她列为“网络一代”的炙手可热的海报女郎。同年，《电子游戏月刊》授予她1997年的“最热门游戏宝贝”，称她“比例匀称”，并称赞她是劳拉的另一可行选择。UGO在2008年“电子游戏热门榜”中将她排在第24位，并补充说他们无法“克服之后的每个游戏版本中她的表现都更好”。同年，GameDaily在“最热游戏辣妹”名单中将她排在第31位，分享了UGO对她的偏爱，并赞扬了她的外表和战斗能力。MSN也有类似的看法，当他们将“这个充满爱心，关怀，超级性感的女孩”列入“游戏界最热门的辣妹”名单时，她名列第六，并指出她在该系列中的存在“有些微妙，给予她更像是一种情感上的暗示。”而且没有她，这个系列就不会那么特别。Manolith在2009年“最热门”女性视频游戏主角名单中将她排名第⼆。2010年，VideoGamer.com将她列为“十大电子游戏女神”，而AfterEllen的塞拉·沃恩（Sarah Warn）将她评为“第九大最热”女性电子游戏角色。2011年，Complex将她列为“游戏中最漂亮的女性角色”第16名，而UGO仅因她在《神佑擂台》中的出现而将她列为“格斗游戏中最优秀的女性”中的第13位。同年，GameFront将她的胸部排在“电子游戏史上最伟大的胸部”名单的第九位，称她为“存在的危机版劳拉；”她也被Village Voice Media列入“不可思议的胸部名单”，但评论说她“不仅仅具有性感。”2012年，Complex将她列为整体上“第二热门”视频游戏角色，MSN将她列为“电子游戏史上最热门的20位女性”之一，并补充说“她是历史上最著名的游戏女孩之一，并且具有永恒的吸引力。”2013年，《每日纪事报》的Scott Marley将她排在“最有魅力的女性电子游戏角色”第二位，而CheatCodes.com则宣布她是有史以来“最热门的女性”。\n",
      "\n",
      "2014年，《La Nueva España》将“性感、独立和坚强”的蒂法列为男女最性感的十大电子游戏角色之一，而2015年，《Thanh Niên》将她评为最性感的女性电子游戏角色。\n",
      "\n",
      "蒂法（Tifa）的英文名字来源于一个古希伯来语单词“Tiferet”，而姓氏洛克哈特（Lockhart）则是英语单词Lock和Hard的结合；Tiferet是生命之树的一个成分（生命之树大概可以分为三支柱、十个原质、四个世界、二十二路径等基本结构），象征着爱情、美丽和自我牺牲，从游戏里可以看出，这几点都符合蒂法的情况。\n"
     ]
    }
   ],
   "source": [
    "# refine：通过循环引用LLM，将文档不断投喂，并产生各种中间答案，适合逻辑有上下文关联的文档，不适合交叉引用的文档\n",
    "# refine：四种文档处理链之一。其他三种是stuff、Map reduce、Map re-mark\n",
    "from langchain.prompts import  PromptTemplate\n",
    "from langchain.document_loaders import PyPDFLoader\n",
    "from langchain.chat_models import ChatOpenAI\n",
    "from langchain.text_splitter import CharacterTextSplitter\n",
    "from langchain.chains.summarize import load_summarize_chain\n",
    "\n",
    "#load\n",
    "loader = PyPDFLoader(\"kecheng/loader.pdf\")\n",
    "docs = loader.load()\n",
    "#split\n",
    "text_split = CharacterTextSplitter.from_tiktoken_encoder(\n",
    "    chunk_size = 1000,\n",
    "    chunk_overlap=0\n",
    ")\n",
    "split_docs = text_split.split_documents(docs)\n",
    "\n",
    "prompt_template = \"\"\"对以下文字做简洁的总结:\n",
    "{text}\n",
    "简洁的总结:\"\"\"\n",
    "\n",
    "prompt = PromptTemplate.from_template(prompt_template)\n",
    "\n",
    "refine_template = (\n",
    "    \"你的任务是产生最终摘要\\n\"\n",
    "    \"我们已经提供了一个到某个特定点的现有回答:{existing_answer}\\n\"\n",
    "    \"我们有机会通过下面的一些更多上下文来完善现有的回答(仅在需要时使用).\\n\"\n",
    "    \"------------\\n\"\n",
    "    \"{text}\\n\"\n",
    "    \"------------\\n\"\n",
    "    \"根据新的上下文，用中文完善原始回答.\\n\"\n",
    "    \"如果上下文没有用处,返回原始回答.\"\n",
    ")\n",
    "\n",
    "refine_prompt = PromptTemplate.from_template(refine_template)\n",
    "llm = ChatOpenAI(\n",
    "    model=\"qwen-plus\",  # 使用通义千问 plus 模型\n",
    "    temperature=0,      # 温度为0，确保输出确定性\n",
    "    openai_api_key=\"sk-4e88cf4db3e14894bafaff606d296610\",\n",
    "    openai_api_base=\"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n",
    ")\n",
    "\n",
    "chain = load_summarize_chain(\n",
    "    llm=llm,\n",
    "    chain_type=\"refine\",\n",
    "    question_prompt=prompt,\n",
    "    refine_prompt = refine_prompt,\n",
    "    return_intermediate_steps=True,\n",
    "    input_key = \"documents\",\n",
    "    output_key = \"output_text\",\n",
    ")\n",
    "\n",
    "print(\"refine：通过循环引用LLM，将文档不断投喂，并产生各种中间答案，适合逻辑有上下文关联的文档，不适合交叉引用的文档\")\n",
    "result = chain({\"documents\":split_docs},return_only_outputs=True)\n",
    "print(result[\"output_text\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "f2880682-36d5-4f2d-9544-0703df0370ec",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "蒂法·洛克哈特是《最终幻想VII》及系列作品中的重要角色，由野村哲也设计。她是主角克劳德的青梅竹马，经营反抗组织“雪崩”的据点“第七天堂”酒吧，擅长格斗，性格坚强独立。她察觉克劳德记忆混乱并帮助他恢复自我，是游戏中关键的情感与战斗支持角色。蒂法因兼具实力与魅力，被广泛认为是电子游戏中最具代表性的女性角色之一。\n",
      "\n",
      "蒂法·洛克哈特是《最终幻想VII》及其系列作品中的重要角色，由野村哲也设计。她是主角克劳德的青梅竹马，经营反抗组织“雪崩”的据点“第七天堂”酒吧，擅长格斗，性格坚强独立。在游戏中，她察觉克劳德记忆混乱并帮助他恢复自我，是关键的情感与战斗支持角色。她兼具实力与魅力，被广泛认为是电子游戏中最具代表性的女性角色之一。\n",
      "\n",
      "在《最终幻想VII》的开发过程中，最初并没有蒂法这个角色，因为游戏最初设定只有三个可玩角色：克劳德、爱丽丝和巴雷特。在讨论剧情发展时，有人建议让其中一个主角死亡，最终制片人决定让爱丽丝牺牲。这一决定促使蒂法被引入游戏，野村哲也开玩笑称这是他提出的想法。北濑佳范也表示喜欢有两个女性主角的设计，并在她们之间形成情感张力。\n",
      "\n",
      "除了原版游戏外，蒂法在《最终幻想VII补完计划》的多个作品中均有登场。在2005年的CG电影《最终幻想VII 降临之子》中，她继续支持因心理创伤而陷入挣扎的克劳德，同时照顾巴雷特的养女玛琳和克劳德救下的孩子丹泽尔。她与萨菲罗斯的思念体罗兹展开战斗，并协助对抗召唤兽巴哈姆特。编剧野岛一成表示，电影中试图描绘她因克劳德的情感疏离而受到伤害的一面，但又不希望她显得软弱。\n",
      "\n",
      "此外，蒂法在前传作品《危机之前》《核心危机》和OVA《最终命令》中都有出现，主要围绕尼布尔海姆毁灭的事件展开。在小说《通向微笑之路》中，详细描述了她在克劳德失踪后如何在Edge City重建第七天堂，并努力维持一个“家庭”的温暖。她还在《地狱犬的挽歌》中短暂登场，协助文森特·瓦伦丁保护星球。\n",
      "\n",
      "蒂法也活跃于其他跨界作品中，如格斗游戏《神佑擂台》《最终幻想 纷争012》、电子棋盘游戏《富豪街》以及《王国之心II》等。她还曾出现在韩国歌手Ivy的MV中，因涉及《降临之子》的战斗画面而引发版权争议。2015年，她作为可玩角色加入iOS游戏《最终幻想 记录者》。\n",
      "\n",
      "凭借其深刻的角色塑造与广泛的跨媒体影响力，蒂法·洛克哈特成为电子游戏史上最具标志性的女性角色之一。\n",
      "\n",
      "蒂法·洛克哈特是《最终幻想VII》及其系列作品中的重要角色，由野村哲也设计。她是主角克劳德的青梅竹马，经营反抗组织“雪崩”的据点“第七天堂”酒吧，擅长格斗，性格坚强独立。在游戏中，她察觉克劳德记忆混乱并帮助他恢复自我，是关键的情感与战斗支持角色。她兼具实力与魅力，被广泛认为是电子游戏中最具代表性的女性角色之一。\n",
      "\n",
      "在《最终幻想VII》的开发过程中，最初并没有蒂法这个角色，因为游戏最初设定只有三个可玩角色：克劳德、爱丽丝和巴雷特。在讨论剧情发展时，有人建议让其中一个主角死亡，最终制片人决定让爱丽丝牺牲。这一决定促使蒂法被引入游戏，野村哲也开玩笑称这是他提出的想法。北濑佳范也表示喜欢有两个女性主角的设计，并在她们之间形成情感张力。\n",
      "\n",
      "除了原版游戏外，蒂法在《最终幻想VII补完计划》的多个作品中均有登场。在2005年的CG电影《最终幻想VII 降临之子》中，她继续支持因心理创伤而陷入挣扎的克劳德，同时照顾巴雷特的养女玛琳和克劳德救下的孩子丹泽尔。她与萨菲罗斯的思念体罗兹展开战斗，并协助对抗召唤兽巴哈姆特。编剧野岛一成表示，电影中试图描绘她因克劳德的情感疏离而受到伤害的一面，但又不希望她显得软弱。野村哲也将蒂法在电影中的角色分为多个方面，称她“像母亲、爱人、战斗中的亲密盟友”，强调她“不仅在情感上，而且在身体上也非常坚强”。\n",
      "\n",
      "此外，蒂法在前传作品《危机之前》《核心危机》和OVA《最终命令》中都有出现，主要围绕尼布尔海姆毁灭的事件展开。在小说《通向微笑之路》中，详细描述了她在克劳德失踪后如何在Edge City重建第七天堂，并努力维持一个“家庭”的温暖。她还在《地狱犬的挽歌》中短暂登场，协助文森特·瓦伦丁保护星球。\n",
      "\n",
      "在视觉设计方面，蒂法最初被设计为该系列以前游戏中出现的“Monk”级别的角色。她拥有乌黑的长发，穿着白色上衣和黑色超短裙，搭配红色靴子和手套，黑色袖子从手腕延伸到肘部，左肘配有金属护罩。她的身高为167厘米，三围为92-60-88厘米。在最初的设定中，野村哲也在迷你裙和长裤之间犹豫不决，最终团队成员更倾向于超短裙设计。这种设计与爱丽丝的长裙形成鲜明对比，同时也赋予了她行动自由的能力，适合她近距离战斗的特点。\n",
      "\n",
      "在《降临之子》中，蒂法的服装进行了重新设计，以更好地体现她的女性特质。她穿着白色背心覆盖黑色背心，粉红丝带缠绕腿部，黑色系扣裙子下穿有短裤，并用一块类似大衣的布从腰带后部延伸到脚踝。她的发型也有所变化，去掉了原本如海豚尾巴般的尾端，改为更自然的垂直剪裁。瞳孔颜色由红色改为深褐色，以更符合角色形象。\n",
      "\n",
      "在《最终幻想VII 重制版》中，蒂法的外观更加逼真，身体线条更贴合战斗需求，服装改为黑色运动内衣。她的发型保留了“海豚尾巴”的风格，但末端更为自然。玩家在第三章可以选择三种不同风格的服饰：成熟风、格斗家风和异国风，开发团队也曾考虑过女仆风、警察服、舞蹈家风等设计。由于克劳德与蒂法和爱丽丝之间的特殊关系，开发团队观察到粉丝认为史克威尔更偏爱这两个女主角。最终，史克威尔确认蒂法和爱丽丝都是重制版中的女主角。\n",
      "\n",
      "在配音方面，日本配音演员伊藤步为蒂法配音，她那“沙哑的声音”与爱丽丝的轻柔声线形成鲜明对比。制作团队也参考了伊藤步的许多特征来完善蒂法的形象。在英文版本中，瑞秋·莱·寇克曾为《王国之心II》中的蒂法配音，并称赞她“身体和情感上都很强壮，也非常多维”。布里特·巴伦在《最终幻想VII 重制版》中接替配音，而蒂法年幼时则由Glory Curda配音。\n",
      "\n",
      "自登场以来，蒂法受到评论家和粉丝的极大好评。在2000年，GameSpot的读者将她评为电子游戏中第五好的女性角色，该网站的编辑也对此表示认同。2004年，她继续在多个评选中占据前列位置，成为电子游戏史上最具标志性的女性角色之一。凭借其深刻的角色塑造与广泛的跨媒体影响力，蒂法·洛克哈特已成为《最终幻想》系列乃至整个游戏界最具代表性的女性角色之一。\n"
     ]
    }
   ],
   "source": [
    "print(\"\\n\\n\".join(result[\"intermediate_steps\"][:3]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "e75e5da9-661c-48d2-8222-6c3dc93c8130",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\27727\\AppData\\Local\\Temp\\ipykernel_15928\\3844365023.py:52: LangChainDeprecationWarning: This class is deprecated. Please see the migration guide here for a recommended replacement: https://python.langchain.com/docs/versions/migrating_chains/map_reduce_chain/\n",
      "  reduce_final_chain = ReduceDocumentsChain(\n",
      "C:\\Users\\27727\\AppData\\Local\\Temp\\ipykernel_15928\\3844365023.py:60: LangChainDeprecationWarning: This class is deprecated. Please see the migration guide here for a recommended replacement: https://python.langchain.com/docs/versions/migrating_chains/map_reduce_chain/\n",
      "  map_reduce_chain = MapReduceDocumentsChain(\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Map reduce: 先将每个文档或文档块分别投喂给LLM，并得到结果集（Map步骤），然后通过一个文档合并链，获得一个输出结果（Reduce步骤）\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\conda_envs\\rag_learn\\lib\\site-packages\\langchain_community\\chat_models\\openai.py:174: UserWarning: Unexpected type for token usage: <class 'NoneType'>\n",
      "  warnings.warn(f\"Unexpected type for token usage: {type(new_usage)}\")\n",
      "Warning: model not found. Using cl100k_base encoding.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "**总结：**\n",
      "\n",
      "蒂法·洛克哈特是《最终幻想VII》及其系列作品中的核心女性角色之一，由野村哲也设计。她最初并非游戏原计划角色，后因剧情调整（爱丽丝被设定为牺牲角色）而加入，最终成为推动故事发展的关键人物。她是主角克劳德的青梅竹马，在童年时期因一次意外加深了彼此感情，并在克劳德离开家乡前许下保护她的承诺。在尼布尔海姆被毁后，她加入反抗组织“雪崩”，经营据点“第七天堂”酒吧，并在米德加重开该酒吧，同时照顾受星痕症候群影响的孩子们。\n",
      "\n",
      "蒂法性格坚强、独立、富有同理心，是战斗主力，擅长使用拳套进行格斗。她在情感上给予克劳德巨大支持，帮助他面对精神崩溃并找回自我。她与爱丽丝·盖恩斯巴勒关系友好但存在微妙竞争。蒂法不仅在主线游戏中扮演重要角色，还在多部衍生作品中登场，包括《最终幻想VII 降临之子》《核心危机》《地狱犬的挽歌》等，也出现在《王国之心II》《神佑擂台》《最终幻想 纷争》等跨界作品中。\n",
      "\n",
      "在《降临之子》中，蒂法被描绘为兼具母亲、爱人和战斗伙伴的多重角色，造型经过多次修改以更好地展现其女性特质和战斗能力。在《重制版》中，她的形象更加写实，并提供多套服装供玩家选择。她的角色配音由多位演员担任，性格被广泛认为兼具坚强与情感深度。\n",
      "\n",
      "蒂法自登场以来广受玩家和评论家好评，被誉为电子游戏史上最受欢迎和最具代表性的女性角色之一。她因性感、独立的形象多次被评为“最性感的女性游戏角色”，其名字源自古希伯来语“Tiferet”，意为“爱、美与牺牲”，与其角色特质高度契合。此外，围绕她的二次创作也曾引发版权争议。\n"
     ]
    }
   ],
   "source": [
    "# Map reduce: 四种文档处理链之一，先将每个文档或文档块分别投喂给LLM，并得到结果集（Map步骤），然后通过一个文档合并链，获得一个输出结果（Reduce步骤）\n",
    "from langchain.chains import MapReduceDocumentsChain\n",
    "from langchain.chains import ReduceDocumentsChain\n",
    "from langchain.chains.combine_documents.stuff import StuffDocumentsChain\n",
    "from langchain.prompts import PromptTemplate\n",
    "from langchain.chat_models import ChatOpenAI\n",
    "from langchain.chains import LLMChain\n",
    "from langchain.document_loaders import PyPDFLoader\n",
    "from langchain.text_splitter import CharacterTextSplitter\n",
    "\n",
    "#load pdf\n",
    "loader = PyPDFLoader(\"kecheng/loader.pdf\")\n",
    "docs = loader.load()\n",
    "#split text\n",
    "text_splitter = CharacterTextSplitter.from_tiktoken_encoder(\n",
    "    chunk_size=1000,\n",
    "    chunk_overlap=0,\n",
    ")\n",
    "split_docs = text_splitter.split_documents(docs)\n",
    "#print(split_docs)\n",
    "\n",
    "#map chain\n",
    "map_template = \"\"\"对以下文字做简洁的总结:\n",
    "\"{content}\"\n",
    "简洁的总结:\"\"\"\n",
    "map_prompt = PromptTemplate.from_template(map_template)\n",
    "llm = ChatOpenAI(\n",
    "    model=\"qwen-plus\",  # 使用通义千问 plus 模型\n",
    "    temperature=0,      # 温度为0，确保输出确定性\n",
    "    openai_api_key=\"sk-4e88cf4db3e14894bafaff606d296610\",\n",
    "    openai_api_base=\"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n",
    ")\n",
    "map_chain = LLMChain(\n",
    "    llm=llm,\n",
    "    prompt=map_prompt,\n",
    ")\n",
    "\n",
    "#reduce chain\n",
    "reduce_template = \"\"\"以下是一个摘要集合:\n",
    "{doc_summaries}\n",
    "将上述摘要与所有关键细节进行总结.\n",
    "总结:\"\"\"\n",
    "reduce_prompt = PromptTemplate.from_template(reduce_template)\n",
    "reduce_chain = LLMChain(\n",
    "    prompt=reduce_prompt,\n",
    "    llm=llm,\n",
    ")\n",
    "stuff_chain = StuffDocumentsChain(\n",
    "    llm_chain=reduce_chain,\n",
    "    document_variable_name=\"doc_summaries\",\n",
    ")\n",
    "reduce_final_chain = ReduceDocumentsChain(\n",
    "    combine_documents_chain=stuff_chain,\n",
    "    #超过4000个token就会切入到下一个stuff_chain\n",
    "    collapse_documents_chain=stuff_chain,\n",
    "    token_max=4000,\n",
    ")\n",
    "\n",
    "#map reduce chain\n",
    "map_reduce_chain = MapReduceDocumentsChain(\n",
    "    llm_chain=map_chain,\n",
    "    document_variable_name=\"content\",\n",
    "    reduce_documents_chain=reduce_final_chain,\n",
    ")\n",
    "print(\"Map reduce: 先将每个文档或文档块分别投喂给LLM，并得到结果集（Map步骤），然后通过一个文档合并链，获得一个输出结果（Reduce步骤）\")\n",
    "summary = map_reduce_chain.run(split_docs)\n",
    "print(summary)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "d1de3062-9119-4b3d-8588-4e0cf538b6b1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "verbose=False llm_chain=LLMChain(verbose=False, prompt=PromptTemplate(input_variables=['context', 'question'], input_types={}, output_parser=RegexParser(regex='(.*?)\\\\nScore: (\\\\d*)', output_keys=['answer', 'score']), partial_variables={}, template=\"Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer.\\n\\nIn addition to giving an answer, also return a score of how fully it answered the user's question. This should be in the following format:\\n\\nQuestion: [question here]\\nHelpful Answer: [answer here]\\nScore: [score between 0 and 100]\\n\\nHow to determine the score:\\n- Higher is a better answer\\n- Better responds fully to the asked question, with sufficient level of detail\\n- If you do not know the answer based on the context, that should be a score of 0\\n- Don't be overconfident!\\n\\nExample #1\\n\\nContext:\\n---------\\nApples are red\\n---------\\nQuestion: what color are apples?\\nHelpful Answer: red\\nScore: 100\\n\\nExample #2\\n\\nContext:\\n---------\\nit was night and the witness forgot his glasses. he was not sure if it was a sports car or an suv\\n---------\\nQuestion: what type was the car?\\nHelpful Answer: a sports car or an suv\\nScore: 60\\n\\nExample #3\\n\\nContext:\\n---------\\nPears are either red or orange\\n---------\\nQuestion: what color are apples?\\nHelpful Answer: This document does not answer the question\\nScore: 0\\n\\nBegin!\\n\\nContext:\\n---------\\n{context}\\n---------\\nQuestion: {question}\\nHelpful Answer:\"), llm=ChatOpenAI(client=<openai.resources.chat.completions.completions.Completions object at 0x000001B81DC87E80>, async_client=<openai.resources.chat.completions.completions.AsyncCompletions object at 0x000001B81E0EB4F0>, model_name='qwen-plus', temperature=0.0, model_kwargs={}, openai_api_key='sk-4e88cf4db3e14894bafaff606d296610', openai_api_base='https://dashscope.aliyuncs.com/compatible-mode/v1', openai_proxy=''), output_parser=StrOutputParser(), llm_kwargs={}) document_variable_name='context' rank_key='score' answer_key='answer' metadata_keys=['source'] return_intermediate_steps=True\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\conda_envs\\rag_learn\\lib\\site-packages\\langchain\\chains\\llm.py:370: UserWarning: The apply_and_parse method is deprecated, instead pass an output parser directly to LLMChain.\n",
      "  warnings.warn(\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "result： {'input_documents': [Document(metadata={'producer': 'macOS 版本14.1.1（版号23B81） Quartz PDFContext', 'creator': '文本编辑', 'creationdate': \"D:20231122121354Z00'00'\", 'title': '蒂法介绍', 'moddate': \"D:20231122121354Z00'00'\", 'source': 'kecheng/loader.pdf', 'total_pages': 5, 'page': 0, 'page_label': '1'}, page_content='蒂法介绍\\n蒂法· 洛克哈特（⽇语：ティファ・ロックハート，Tifa Rokkuhāto，英语：Tifa \\nLockhart）为电⼦游戏《最终幻想VII》及《最终幻想VII补完计划》相关作品中的虚构⻆\\n⾊，由野村哲也创作和设计，此后也在多个游戏中客串登场。\\n2014年东京电玩展上，星名美津纪cosplay《最终幻想VII 降临之⼦》中的蒂法· 洛克哈特\\n蒂法是克劳德的⻘梅⽵⻢，两⼈同为尼布鲁海姆出身。在⽶德加经营作为反抗组织“雪崩”根\\n据地的酒馆“第七天堂”，并且是⼩有名⽓的招牌店员。擅⻓格⽃，以拳套为武器。本传7年前\\n克劳德离开故乡从军时，曾许下约定“如果有危机时⼀定会保护她”。与爱丽丝相识之后，两\\n⼈成为好友。第⼀个察觉克劳德记忆混乱的⼈，后来协助精神崩溃的克劳德重新找回真正的⾃\\n⼰。本传的⼤战结束后，依⼤家的期待在战后新⽣的⽶德加再次开设第七天堂（原第七天堂因\\n第柒区圆盘崩塌遭压毁），同时也照顾⼀群受到星痕症候群折磨的孩⼦们。\\n蒂法被《纽约时报》称为“⽹络⼀代”的海报⼥郎，与劳拉· 克罗夫特相⽐，她是电⼦游戏中坚\\n强、独⽴和有吸引⼒的⼥性⻆⾊的典型代表。媒体普遍称赞其实⼒和外表，并称她为游戏世界\\n中最好的⼥性⻆⾊之⼀。\\n在《最终幻想VII》本传中，蒂法年龄20岁、身⾼167cm、⽣⽇5⽉3⽇、⾎型B型、出⽣地尼\\n布尔海姆。\\n登场\\n《最终幻想VII》\\n蒂法在《最终幻想VII》原版中⾸次亮相，是克劳德的⻘梅⽵⻢、第七天堂酒吧的看板娘、极\\n端环境组织“雪崩”成员，该组织反抗巨型企业“神罗”因其⼤量抽取魔晄⽤作动⼒能源。在注\\n意到克劳德的性格改变后，她说服克劳德加⼊雪崩，以密切关注他，并且跟随他追寻游戏中的\\n对⼿萨菲罗斯。她⽆法阻⽌克劳德被萨菲罗斯操纵，在他的精神崩溃后，她帮助克劳德康复，\\n并且两⼈意识到彼此间的相互感觉，最后与伙伴们⼀同击败了萨菲罗斯。[2]\\n在闪回中可知，⼉时的蒂法⼀直是村中⼩孩的⼈⽓王。在⺟亲过世后，思念⺟亲的蒂法决定沿\\n着⼩路⾛到他们故乡尼布尔海姆附近的⼀座⼭上，认为这样就能⻅到过世的⺟亲，原本跟着蒂\\n法的其他⼩孩都在半路上因害怕⽽放弃，唯独克劳德仍坚定的在后⾯跟随，希望能在危机时保\\n护蒂法。然⽽，他们俩都从⼭上跌落受伤，蒂法昏迷了⼀个星期，她的⽗亲认为克劳德对此负\\n有责任[3]，甚为严令禁⽌克劳德再接近蒂法，但蒂法反⽽从此更在意克劳德，两⼈成为要好\\n的玩伴。为了使⾃⼰变得更强⼤，克劳德最终选择离开尼布尔海姆，加⼊神罗，想要成为神罗\\n的精英战⼠“神罗战⼠”（SOLDIER），但后来透露他主要是为了吸引蒂法的注意⼒。离开之\\n前，蒂法与克劳德约定，当蒂法处于困境之中时，克劳德会回来救她。从克劳德离开之后，蒂\\n法便开始留意神罗战⼠的消息，因为神罗战⼠都成为声名远播的知名⼈物，如果克劳德成为神\\n罗战⼠，他的活跃也会⽴刻传回尼布尔海姆。数年后，在萨菲罗斯摧毁了尼布尔海姆之后，克\\n劳德为了救蒂法，被萨菲罗斯刺⾄重伤。蒂法被她的武术教练赞⼲带到安全地带，幸存下来，\\n最终到达⽶德加并遇⻅了“雪崩”的领导⼈巴雷特· 华莱⼠。病愈后，蒂法加⼊了“雪崩”，为\\n了给家乡被毁⼀事报仇。⼀天，她在⽕⻋站遇到了从魔晄炉中逃出来、精神⼀⽚混乱的克劳\\n德，蒂法说服了他为巴雷特⼯作，以保证克劳德的安全以及和克劳德保持紧密关系。这是游戏\\n开始的地⽅。\\n在原版《最终幻想VII》中蒂法与爱丽丝关系友好，但会在某些时候争⻛吃醋，例如在神罗总\\n部营救爱丽丝时，蒂法及巴雷特等⼀⾏失⼿被擒，若克劳德选择关⼼爱丽丝的话蒂法的对话中\\n明显带有妒忌。在重制版中虽然删去这段情节，但保留了这种关系。\\n在《最终幻想VII》的初稿中，蒂法是背景⼈物。她在“雪崩”中的作⽤是在幕后⽀持，在执\\n⾏任务后为所有⼈加油⿎劲，并且对克劳德有特别的关⼼。据推测，她的背上有⼀块⼤的疤'), Document(metadata={'producer': 'macOS 版本14.1.1（版号23B81） Quartz PDFContext', 'creator': '文本编辑', 'creationdate': \"D:20231122121354Z00'00'\", 'title': '蒂法介绍', 'moddate': \"D:20231122121354Z00'00'\", 'source': 'kecheng/loader.pdf', 'total_pages': 5, 'page': 1, 'page_label': '2'}, page_content='痕，是由克劳德造成的，并在事件发⽣时因巨⼤冲击⽽部分失忆。[4]原版策划者之⼀的加藤\\n正⼈提出了⼀个旨在暗示蒂法和克劳德发⽣性关系的场景，但被北濑佳范⽤⼀个变淡的⾊调所\\n取代。野岛⼀成在接受采访时说，没有⼀个开发团队⼈员认为当时的场景会成为⼀个问题。\\n[5]\\n《最终幻想VII补完计划》\\n2005年，蒂法出现在CG电影《最终幻想VII 降临之⼦》中，故事发⽣在原版游戏剧情结束\\n两年后。在其中，她试图给予克劳德情感上的⽀持，敦促克劳德放下他对⾃⼰施加的不必要的\\n罪恶感。此外，她还照顾巴雷特的养⼥玛琳和克劳德在爱丽丝的教堂发⻔⼝救下的孩⼦丹泽\\n尔。在电影中，她与萨菲罗斯的其中⼀个思念体罗兹战⽃，后来她帮助与被召唤的⽣物巴哈姆\\n特战⽃。编剧野岛⼀成将她在视频中的⻆⾊描述为“⾮常像任何被男⼈抛弃的⼥⼈”，并表示\\n尽管他们不希望她显得笨拙，但他们也想描绘出从她受到克劳德的情感伤害出发。[6]在视频\\n的初稿中，她原本计划在当时的短⽚中扮演更重要的⻆⾊，该短⽚仅以蒂法，克劳德和⼏个孩\\n⼦为主。\\n蒂法也在前传游戏《最终幻想VII 危机之前》和《最终幻想VII 核⼼危机》以及OVA《最终\\n幻想VII 最终命令》中登场。每次登场时，她的出现都与尼布尔海姆的毁灭有关。[2]官⽅\\n⼩说《通向微笑之路》中有专⻔的《蒂法篇》，讲述了原版游戏和降临之⼦两段之间的故事。\\n从蒂法的⻆度出发，详细讲述了她如何在Edge City创建⼀个新的第七天堂酒吧，并试图坚\\n持⾃⼰和克劳德的正常家庭观念，尽管克劳德逐渐开始逃避与他⼈接触。蒂法还短暂出现在游\\n戏《最终幻想VII 地狱⽝的挽歌》中，该游戏的剧情在降临之⼦故事⼀年后发⽣，她在游戏\\n中帮助主⻆⽂森特· 瓦伦丁捍卫星球，抵抗怪物欧⽶茄和“兵器”。她后来出现在游戏的结尾\\n中，讨论着⽂森特的失踪。[2]\\n其他登场\\n在《最终幻想VII补完计划》之外，蒂法还出现在格⽃游戏《神佑擂台》中，作为可解锁的⻆\\n⾊和可选的Boss。[7]她后来出现在电⼦棋盘游戏《富豪街》中。在《王国之⼼II》中，她\\n穿着⾃⼰在降临之⼦中的服装，寻找克劳德，然后与该系列的怪物“⽆⼼”战⽃。她原本计划\\n出现在原版《王国之⼼》的最终合辑中，但由于时间限制，⼯作⼈员选择改⽤萨菲罗斯。[8]\\n蒂法也是格⽃游戏《最终幻想 纷争012》中的玩家⻆⾊之⼀，该游戏的⻆⾊来⾃各种《最终\\n幻想》游戏。[9]她身着《最终幻想VII》中的服装，但该玩家还可以使⽤她在《降临之⼦》\\n中的服装和在尼布尔海姆出场时展示的第三种服装。[10][11]游戏的第⼀版展示内容是在天\\n野喜孝的美术原型基础上展现的另⼀种形式。[12]在《⼩⼩⼤星球2》中，蒂法是可下载的\\n⻆⾊模型。[13]\\n韩国歌⼿Ivy在2007年的歌曲“ਬ\\u0d11\\u0a44ਬ\\u0d11\\u0a44”（《诱惑奏鸣曲》）MV中描绘了⻆⾊。因为重现\\n了《降临之⼦》中的战⽃场⾯，在史克威尔艾尼克斯提出版权诉讼后，该视频被禁⽌在韩国电\\n视上播出。[14] 2015年，蒂法作为可玩⻆⾊被添加到iOS游戏《最终幻想 记录者》中。\\n[15]\\n创作与发展\\n蒂法在《最终幻想VII 核⼼危机》中的形象。\\n蒂法由野村哲也设计，最初版本的《最终幻想VII》中没有蒂法，因为最初该游戏只有三个可\\n玩⻆⾊。主⻆克劳德、爱丽丝和巴雷特。但是，在给游戏总监北濑佳范打电话时，有⼈建议游\\n戏中的某个主⻆应该死掉，在对究竟是巴雷特还是爱丽丝需要死掉进⾏⼤量讨论之后，制⽚⼈\\n选择了爱丽丝。[3]野村哲也后来开玩笑说这是他的主意，以便使他能够将蒂法引⼊游戏中。\\n[16]⽆论如何，北濑佳范喜欢有两个的⼥主⼈公，并且在他们之间摇摆不定，将其称之为是'), Document(metadata={'producer': 'macOS 版本14.1.1（版号23B81） Quartz PDFContext', 'creator': '文本编辑', 'creationdate': \"D:20231122121354Z00'00'\", 'title': '蒂法介绍', 'moddate': \"D:20231122121354Z00'00'\", 'source': 'kecheng/loader.pdf', 'total_pages': 5, 'page': 2, 'page_label': '3'}, page_content='《最终幻想》系列中的新事物。[5]野村哲也将蒂法的⻆⾊在《降临之⼦》中的表现分为多个\\n⽅⾯，称她“像⺟亲，爱⼈，战⽃中的亲密盟友”，“不仅在情感上，⽽且在身体上也⾮常坚\\n强”。[6]\\n蒂法被设计为该系列以前的游戏中出现的“Monk”级别的⻆⾊。她有⼀头乌⿊的⻓发，像⼀头\\n海豚的尾巴，穿着简单单调的服装，包括⽩⾊的上⾐和⿊⾊的超短裙。她还穿着红⾊的靴⼦和\\n⼿套，⿊⾊的袖⼦从⼿腕延伸到肘部。她的裙⼦被⼀对狭窄的⿊⾊吊带裤撑起，⼤⾯积的⾦属\\n护罩覆盖了她的左肘。她身⾼约167厘⽶[17]，三围为92-60-88厘⽶。[4]最初，野村哲也\\n很难决定选择搭配迷你裙还是搭配⻓裤。为了征求意⻅，他在史克威尔的办公室传递了草图，\\n⼤多数⼯作⼈员都认同超短裙设计。[16]这与爱丽丝的标志形成鲜明对⽐，爱丽丝的⻓裙是\\n她的标志。服装在游戏中被解释为赋予了她⾏动⾃由的能⼒，这是由于她的近距离战⽃的亲和\\n⼒，⽽裙⼦据称“相当短，具有相当⼤的曝光度”[4]。开发者还指出，由于她的身材，她穿\\n着其他便⾐的外观也令⼈愉悦。[4]\\n在制作《最终幻想VII 降临之⼦》时，联合导演野末武志难以为蒂法的身材构建出⼀个“平\\n衡，但⼜展现了她的⼥性特质”的框架。在这⼀点上，她的服装也进⾏了重新设计，着重于表\\n达这些品质，同时仍然令⼈赏⼼悦⽬。⽩⾊背⼼覆盖⿊⾊背⼼，⽩⾊缎带背⼼包裹着她的左⼆\\n头肌，粉红丝带包裹着她的脚。⿊⾊系扣裙⼦遮盖了她的⼤腿，并且在下⾯穿了短裤，⽤⼀块\\n类似于⼤⾐的布从裙⼦的腰带后部延伸到脚踝。她不再使⽤吊带撑起裙⼦，只在电影的战⽃场\\n景中戴着⼿套。她的发型被更改为在她的背部中部结束，从原来的设计中删除了海豚的尾巴。\\n[6]造成这种变化的原因是，难以为她的原始头发设置动画效果，以及由于其⿊⾊和亮光⽽引\\n起的问题。另外，瞳孔的颜⾊亦由红⾊改为深褐⾊。\\n蒂法在《最终幻想VII 重制版》中的形象。\\n开发《最终幻想VII 重制版》时，史克威尔修改了蒂法的原始外观，以使她的外观更加逼\\n真，因为⼯作⼈员意识到她的设计不适合战⽃场景。她因此得到了⿊⾊运动内⾐并贴合她的身\\n体，给她⼀种运动的感觉。[18]在这个版本中的蒂法虽然保留着“海豚尾巴”发型，但原版中\\n其末端如海豚尾鳍已变为更⾃然的垂直模样。另外,在第三章中,玩家可选三种服饰中的⼀种\\n让蒂法在以后的篇章穿上。除了“成熟⻛”、“格⽃家⻛”及“异国⻛”外，开发团队亦考虑过\\n“⼥仆⻛”、“警察服”、“舞蹈家⻛”、“陆⾏⻦⻛”等[19]。由于克劳德与蒂法和爱丽丝之间\\n存在的特殊关系，开发团队观察到粉丝认为史克威尔更偏爱这两个⼥主⻆。以往，史克威尔表\\n示爱丽丝可能是游戏的真正主⻆，⽽蒂法对于帮助克劳德这个⻆⾊的发展很重要。最终，史克\\n威尔表示蒂法和爱丽丝都是这次重制版中的⼥主⻆。[20]\\n野村哲也表示，他喜欢⼥演员伊藤步，并希望与她在《降临之⼦》中合作。在爱丽丝的配⾳演\\n员已经决定之后，野村让伊藤步为蒂法配⾳，觉得她的“沙哑的声⾳”将与坂本真绫配⾳的轻\\n声细语的爱丽丝形成很好的对⽐。[6]野村哲也还指出，在完成蒂法的更新设计后，制⽚⼈对\\n她的最终细节进⾏了辩论，但伊藤步饰演⻆⾊后，便选择将配⾳演员的许多特征融合到⻆⾊的\\n最终形象中。[6]\\n英国配⾳演员瑞秋· 莱· 寇克（Rachael Leigh Cook）在《王国之⼼II》的⼀次采访中\\n说，她喜欢玩蒂法，并形容她“身体和情感上都很强壮，但也⾮常敏感”，并且“⾮常多维”。\\n[21]在给⻆⾊配⾳时，寇克听取了伊藤步的配⾳。在《降临之⼦》制作之后，寇克感谢野村\\n哲也所创作的视频并表示⾮常喜欢。[22]布⾥特· 巴伦（Britt Baron）代替她参加了《最\\n终幻想VII 重制版》的配⾳。[23]蒂法幼年时候由Glory Curda配⾳。[24]\\n评价\\n⾃登场以来，蒂法受到评论家和粉丝的极⼤好评。在2000年，GameSpot的读者将她评为电\\n⼦游戏中的第五好的⼥性⻆⾊，该⽹站的编辑指出他们对此表示同意。[25] 2004年，'), Document(metadata={'producer': 'macOS 版本14.1.1（版号23B81） Quartz PDFContext', 'creator': '文本编辑', 'creationdate': \"D:20231122121354Z00'00'\", 'title': '蒂法介绍', 'moddate': \"D:20231122121354Z00'00'\", 'source': 'kecheng/loader.pdf', 'total_pages': 5, 'page': 3, 'page_label': '4'}, page_content=\"《Play》杂志在《游戏⼥孩》年度期刊的第⼀期中介绍了蒂法，并称她为“近代史上最受崇\\n拜的⼥性。”2007年，蒂法被《电击PlayStation》评为在原版PlayStation平台上有史\\n以来第⼋好的⼈物，也是《最终幻想VII》中排名第三的⻆⾊。[26]同年，Tom's \\nHardware将她列为视频游戏历史上50个最伟⼤的⼥性⻆⾊之⼀，并称她为“周围⼈物中更丰\\n富，更复杂的⼥性⻆⾊之⼀。”[27]在2008年，UGO将她列为电⼦游戏史上最伟⼤的⼥性⻆\\n⾊之⼀，排在第五位，并表示对她的偏好超过了爱丽丝，并补充说：“ 蒂法的服装是轻描淡\\n写的奇迹-但正是她的天⽣丽质和令⼈难忘的性格使她在榜单上名列前茅。”[28]同年，\\nChip杂志将她列为“游戏⼥孩”第⼗名。[29]2009年，IGN将蒂法列为游戏中⼗⼤最佳⼥主\\n⻆之⼀，并称她为“毫⽆疑问的最终幻想宇宙中的传奇⼥主⻆。”[30] Fami通在2010年进\\n⾏的⼀项⺠意调查将她评为第19⼤最受⽇本玩家欢迎的视频游戏⻆⾊。[31]在2013年，\\nComplex将她列为电⼦游戏历史上第13⼤⼥主⻆。[32]\\n2001年，随着劳拉· 克罗夫特的推出，Beaumont Enterprise列举了蒂法作为视频游戏中\\n强⼤⼥性⻆⾊的榜样。2008年，Joystiq将她列为他们希望在史克威尔艾尼克斯的跨界格⽃\\n游戏《最终幻想 纷争》中看到的《最终幻想》系列中20个⻆⾊中的佼佼者，并将她描述为该\\n系列“最伟⼤的⼥主⻆”之⼀。[33]IGN在2008年将蒂法列⼊有史以来第13部最佳的《最终\\n幻想》⻆⾊之⼀，描述她是史克威尔试图“赋予《最终幻想》⻆⾊真实的性感”的尝试，以及\\n“可以在紧要关头照顾好⾃⼰”的⼈；在后续的读者选择榜单中，蒂法排名第⼀，⼯作⼈员在\\n将其在榜单上的位置归因于她的胸部时重复了先前的评论。[34]在2009年IGN的⼀篇⽂章\\n中，仅关注《最终幻想VII》中的⻆⾊，她排在第四位，并评论说，尽管她的性感提⾼了她的\\n知名度，但“ 蒂法推动了坚强，独⽴的RPG⼥主⻆的传统。”[35]其他杂志也称赞蒂法的性\\n格特征。Mania Entertainment在2010年“了不起的视频游戏⼥性”名单中，蒂法排名第\\n⼗，并指出，虽然《最终幻想》系列的后续游戏引⼊了其他令⼈难忘的⼥性⻆⾊，但“蒂法是\\n我们的第⼀个《最终幻想》⼥孩，并在我们⼼中有特殊的地位”。[36] 2013年，\\n《Complex》的Gus Turner将蒂法列为有史以来⼗⼆⼤最终幻想⻆⾊之⼀，并指出“除了劳\\n拉和萨姆斯· 艾仁之外，蒂法也代表了游戏中最独⽴，最有能⼒的⼥性之⼀。” [37]\\n许多评论都认为蒂法⾮常性感。 1998年，《纽约时报》将她列为“⽹络⼀代”的炙⼿可热的\\n海报⼥郎。[38]同年，《电⼦游戏⽉刊》授予她1997年的“最热⻔游戏宝⻉”，称她“⽐例匀\\n称”，并称赞她是劳拉的另⼀可⾏选择。 UGO在2008年“电⼦游戏热⻔榜”中将她排在第24\\n位，并补充说他们⽆法“克服之后的每个游戏版本中她的表现都更好”。[39]同年，\\nGameDaily在“最热游戏辣妹”名单中将她排在第31位，分享了UGO对她的偏爱，并赞扬了她\\n的外表和战⽃能⼒。[40]MSN也有类似的看法，当他们将“这个充满爱⼼，关怀，超级性感的\\n⼥孩”列⼊“游戏界最热⻔的辣妹”名单中时，她名列第六，并指出她在该系列中的存在“有些\\n微妙，给与了她更像是⼀种情感上的暗示。”⽽且没有她，这个系列就不会那么特别。\\n[41]Manolith在2009年“最热⻔”⼥性视频游戏主⻆名单中将她排名第⼆。[42] 2010\\n年，VideoGamer.com将她列为“⼗⼤电⼦游戏⼥神”，[43]⽽AfterEllen的塞拉· 沃恩\\n（Sarah Warn）将她评为“第九⼤最热”⼥性电⼦游戏⻆⾊。[44]2011年，Complex将她\\n列为“游戏中最漂亮的⼥性⻆⾊”第16名，[45]⽽UGO仅因她在《神佑擂台》中的出现⽽将她\\n列为“格⽃游戏中最优秀的⼥性”中的第13位。[46]同年，GameFront将她的胸部排在“电⼦\\n游戏史上最伟⼤的胸部”名单的第九位，称她为“存在的危机版劳拉；” [47]她也被\\nVillage Voice Media列⼊“不可思议的胸部名单”，但评论说她“不仅仅具有性感。”\\n[48]2012年，Complex将她列为整体上“第⼆热⻔”视频游戏⻆⾊，[49]MSN将她列为“电\\n⼦游戏史上最热⻔的20位⼥性”之⼀，并补充说“她是历史上最著名的游戏⼥孩之⼀，并且具\\n有永恒的吸引⼒。” [50]2013年，《每⽇纪事报》的Scott Marley将她排在“最有魅⼒的\\n⼥性电⼦游戏⻆⾊”第⼆位，[51]⽽CheatCodes.com则宣布她是有史以来“最热⻔的⼥性\"), Document(metadata={'producer': 'macOS 版本14.1.1（版号23B81） Quartz PDFContext', 'creator': '文本编辑', 'creationdate': \"D:20231122121354Z00'00'\", 'title': '蒂法介绍', 'moddate': \"D:20231122121354Z00'00'\", 'source': 'kecheng/loader.pdf', 'total_pages': 5, 'page': 4, 'page_label': '5'}, page_content='电⼦游戏⻆⾊”。[52]同样，《La NuevaEspaña》在2014年将“性感，独⽴和坚强”的蒂\\n法列为男⼥最性感的⼗⼤电⼦游戏⻆⾊中，[53]⽽《ThanhNiên》在2015年将她评为最性\\n感的⼥性电⼦游戏⻆⾊。[54]\\n姓名由来\\n蒂法（Tifa）的英⽂名字来源于⼀个古希伯来语单词“Tiferet” ，⽽姓⽒洛克哈特\\n（Lockhart）则是英语单词Lock和Hard的结合；Tiferet是⽣命之树的⼀个成分（⽣命之\\n树⼤概可以分为三⽀柱、⼗个原质、四个世界、⼆⼗⼆路径等基本结构），象征着爱情、美丽\\n和⾃我牺牲，从游戏⾥可以看出，这⼏点都符合Tifa的情况。')], 'question': 'what is this document talk about?answer by chinese', 'source': 'kecheng/loader.pdf', 'intermediate_steps': [{'answer': '', 'score': '100'}, {'answer': 'Helpful Answer: 这篇文档主要讲述了《最终幻想VII》中的角色蒂法（Tifa）的背景故事、在多个游戏和电影中的出场情况，以及她的创作与发展历程。其中包括她在《降临之子》等衍生作品中的角色表现、与其他角色的关系，以及其在游戏设计方面的起源，例如她如何被加入到原本没有她的游戏初始设定中。  ', 'score': '100'}, {'answer': '', 'score': '100'}, {'answer': '', 'score': '95'}, {'answer': '', 'score': '90'}], 'output_text': ''}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\conda_envs\\rag_learn\\lib\\site-packages\\langchain_community\\chat_models\\openai.py:174: UserWarning: Unexpected type for token usage: <class 'NoneType'>\n",
      "  warnings.warn(f\"Unexpected type for token usage: {type(new_usage)}\")\n"
     ]
    }
   ],
   "source": [
    "# Map re-rank：先将每个文档或文档块投喂给LLM,并对每个文档或文档块生成问题的答案进行打分，然后将打分最高的文档或文档块作为最终答案返回\n",
    "from langchain.document_loaders import PyPDFLoader\n",
    "from langchain.text_splitter import CharacterTextSplitter\n",
    "from langchain.chat_models import ChatOpenAI\n",
    "from langchain.chains.qa_with_sources import load_qa_with_sources_chain\n",
    "from langchain.prompts import PromptTemplate\n",
    "\n",
    "llm = ChatOpenAI(\n",
    "    model=\"qwen-plus\",  # 使用通义千问 plus 模型\n",
    "    temperature=0,      # 温度为0，确保输出确定性\n",
    "    openai_api_key=\"sk-4e88cf4db3e14894bafaff606d296610\",\n",
    "    openai_api_base=\"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n",
    ")\n",
    "#load\n",
    "loader = PyPDFLoader(\"kecheng/loader.pdf\")\n",
    "docs = loader.load()\n",
    "#split\n",
    "text_splitter = CharacterTextSplitter.from_tiktoken_encoder(\n",
    "    chunk_size=500, chunk_overlap=0\n",
    ")\n",
    "split_docs = text_splitter.split_documents(docs)\n",
    "\n",
    "chain = load_qa_with_sources_chain(\n",
    "    llm, \n",
    "    chain_type=\"map_rerank\", \n",
    "    metadata_keys=['source'], \n",
    "    return_intermediate_steps=True\n",
    "    )\n",
    "print(chain)\n",
    "\n",
    "query = \"what is this document talk about?answer by chinese\"\n",
    "result = chain({\"input_documents\":split_docs,\"question\":query})\n",
    "print(\"result：\", result)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e9692485-1110-4080-900c-f11a6071fb76",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "rag_learn",
   "language": "python",
   "name": "rag_learn"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
